@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.
@@ -418,6 +418,149 @@ ry-knob[color="danger"] [data-ry-target="ring"] {
418
418
  }
419
419
  ry-knob[color="danger"] [data-ry-target="indicator"] { background-color: var(--ry-color-danger); }
420
420
 
421
+ /* ═══════════════════════════════════════════════════════════════
422
+ NUMBER SELECT
423
+ ═══════════════════════════════════════════════════════════════ */
424
+
425
+ .ry-number-select__btn {
426
+ background: var(--ry-color-bg);
427
+ border: var(--ry-border-width) solid var(--ry-color-border);
428
+ color: var(--ry-color-text);
429
+ transition: background-color var(--ry-duration-fast) var(--ry-ease),
430
+ border-color var(--ry-duration-fast) var(--ry-ease);
431
+ }
432
+
433
+ .ry-number-select__btn:hover {
434
+ background-color: var(--ry-color-bg-muted);
435
+ border-color: var(--ry-color-border-strong);
436
+ }
437
+
438
+ .ry-number-select__btn:active {
439
+ background-color: var(--ry-color-bg-subtle);
440
+ }
441
+
442
+ .ry-number-select__decrement {
443
+ border-radius: var(--ry-radius-md) 0 0 var(--ry-radius-md);
444
+ border-right: none;
445
+ }
446
+
447
+ .ry-number-select__increment {
448
+ border-radius: 0 var(--ry-radius-md) var(--ry-radius-md) 0;
449
+ border-left: none;
450
+ }
451
+
452
+ /* Single-button rounding */
453
+ ry-number-select[arrows="start"] .ry-number-select__decrement {
454
+ border-radius: var(--ry-radius-md);
455
+ border-right: var(--ry-border-width) solid var(--ry-color-border);
456
+ }
457
+
458
+ ry-number-select[arrows="end"] .ry-number-select__increment {
459
+ border-radius: var(--ry-radius-md);
460
+ border-left: var(--ry-border-width) solid var(--ry-color-border);
461
+ }
462
+
463
+ .ry-number-select__display {
464
+ 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);
467
+ }
468
+
469
+ /* Display borders when both arrows */
470
+ ry-number-select:not([arrows]) .ry-number-select__display,
471
+ ry-number-select[arrows="both"] .ry-number-select__display {
472
+ border-left: none;
473
+ border-right: none;
474
+ }
475
+
476
+ /* No arrows: full border + radius */
477
+ ry-number-select[arrows="none"] .ry-number-select__display {
478
+ border: var(--ry-border-width) solid var(--ry-color-border);
479
+ border-radius: var(--ry-radius-md);
480
+ }
481
+
482
+ /* Start only: display gets right border + right radius */
483
+ 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;
487
+ }
488
+
489
+ /* End only: display gets left border + left radius */
490
+ 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);
494
+ }
495
+
496
+ /* Stacked: top-rounded increment, bottom-rounded decrement, no radius on display */
497
+ ry-number-select[arrows="stacked"] .ry-number-select__increment {
498
+ border: var(--ry-border-width) solid var(--ry-color-border);
499
+ border-bottom: none;
500
+ 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
+ }
503
+
504
+ ry-number-select[arrows="stacked"] .ry-number-select__decrement {
505
+ border: var(--ry-border-width) solid var(--ry-color-border);
506
+ border-top: none;
507
+ 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
+ }
510
+
511
+ ry-number-select[arrows="stacked"] .ry-number-select__display {
512
+ border: var(--ry-border-width) solid var(--ry-color-border);
513
+ border-top: none;
514
+ border-bottom: none;
515
+ border-radius: 0;
516
+ }
517
+
518
+ .ry-number-select__value {
519
+ font-family: var(--ry-font-mono);
520
+ font-size: var(--ry-text-sm);
521
+ font-weight: var(--ry-font-medium);
522
+ color: var(--ry-color-text);
523
+ }
524
+
525
+ .ry-number-select__input {
526
+ font-family: var(--ry-font-mono);
527
+ font-size: var(--ry-text-sm);
528
+ font-weight: var(--ry-font-medium);
529
+ color: var(--ry-color-text);
530
+ background: transparent;
531
+ border: none;
532
+ border-bottom: 2px solid var(--ry-color-primary);
533
+ }
534
+
535
+ .ry-number-select__display:focus-visible {
536
+ outline: none;
537
+ box-shadow: var(--ry-focus-ring);
538
+ border-color: var(--ry-color-primary);
539
+ }
540
+
541
+ .ry-number-select__affix {
542
+ font-family: var(--ry-font-mono);
543
+ font-size: var(--ry-text-sm);
544
+ color: var(--ry-color-text-muted);
545
+ }
546
+
547
+ .ry-number-select__label {
548
+ font-size: var(--ry-text-sm);
549
+ color: var(--ry-color-text-muted);
550
+ }
551
+
552
+ ry-number-select[disabled] {
553
+ opacity: 0.5;
554
+ }
555
+
556
+ ry-number-select[size="xs"] .ry-number-select__value {
557
+ font-size: var(--ry-text-xs);
558
+ }
559
+
560
+ ry-number-select[size="xs"] .ry-number-select__affix {
561
+ font-size: var(--ry-text-xs);
562
+ }
563
+
421
564
  /* ═══════════════════════════════════════════════════════════════
422
565
  CARDS
423
566
  ═══════════════════════════════════════════════════════════════ */
@@ -1445,3 +1588,211 @@ ry-color-input [data-ry-target="panel"] {
1445
1588
  border-radius: var(--ry-radius-lg);
1446
1589
  box-shadow: var(--ry-shadow-lg);
1447
1590
  }
1591
+
1592
+ /* ═══════════════════════════════════════════════════════════════
1593
+ GRADIENT PICKER
1594
+ ═══════════════════════════════════════════════════════════════ */
1595
+
1596
+ ry-gradient-picker {
1597
+ background-color: var(--ry-color-bg);
1598
+ border: var(--ry-border-width) solid var(--ry-color-border);
1599
+ border-radius: var(--ry-radius-lg);
1600
+ box-shadow: var(--ry-shadow-md);
1601
+ }
1602
+
1603
+ ry-gradient-picker[disabled] {
1604
+ opacity: 0.5;
1605
+ }
1606
+
1607
+ /* Type toggle buttons */
1608
+ ry-gradient-picker [data-ry-target="type-toggle"] button {
1609
+ font-family: var(--ry-font-sans);
1610
+ font-size: var(--ry-text-xs);
1611
+ background-color: transparent;
1612
+ color: var(--ry-color-text-muted);
1613
+ border-radius: var(--ry-radius-sm);
1614
+ transition: background-color var(--ry-duration-fast) var(--ry-ease),
1615
+ color var(--ry-duration-fast) var(--ry-ease);
1616
+ }
1617
+
1618
+ ry-gradient-picker [data-ry-target="type-toggle"] button:hover {
1619
+ background-color: var(--ry-color-bg-subtle);
1620
+ }
1621
+
1622
+ ry-gradient-picker [data-ry-target="type-toggle"] button[data-active] {
1623
+ background-color: var(--ry-color-primary);
1624
+ color: var(--ry-color-text-inverse);
1625
+ }
1626
+
1627
+ /* Shape toggle */
1628
+ ry-gradient-picker [data-ry-target="shape-control"] button {
1629
+ font-family: var(--ry-font-sans);
1630
+ font-size: var(--ry-text-xs);
1631
+ background-color: transparent;
1632
+ color: var(--ry-color-text-muted);
1633
+ border-radius: var(--ry-radius-sm);
1634
+ transition: background-color var(--ry-duration-fast) var(--ry-ease),
1635
+ color var(--ry-duration-fast) var(--ry-ease);
1636
+ }
1637
+
1638
+ ry-gradient-picker [data-ry-target="shape-control"] button:hover {
1639
+ background-color: var(--ry-color-bg-subtle);
1640
+ }
1641
+
1642
+ ry-gradient-picker [data-ry-target="shape-control"] button[data-active] {
1643
+ background-color: var(--ry-color-primary);
1644
+ color: var(--ry-color-text-inverse);
1645
+ }
1646
+
1647
+ /* Gradient bar */
1648
+ ry-gradient-picker [data-ry-target="bar"] {
1649
+ border-radius: var(--ry-radius-full, 9999px);
1650
+ box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1);
1651
+ }
1652
+
1653
+ /* Stop handles */
1654
+ ry-gradient-picker [data-ry-target="stop"] {
1655
+ background-color: var(--stop-color, #fff);
1656
+ border: 2px solid #fff;
1657
+ border-radius: var(--ry-radius-full);
1658
+ box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.3), var(--ry-shadow-sm);
1659
+ transition: transform var(--ry-duration-fast) var(--ry-ease),
1660
+ opacity var(--ry-duration-fast) var(--ry-ease);
1661
+ }
1662
+
1663
+ ry-gradient-picker [data-ry-target="stop"][data-selected] {
1664
+ box-shadow: 0 0 0 2px var(--ry-color-primary), var(--ry-shadow-md);
1665
+ }
1666
+
1667
+ ry-gradient-picker [data-ry-target="stop"]:focus-visible {
1668
+ outline: none;
1669
+ box-shadow: 0 0 0 2px var(--ry-color-primary), var(--ry-focus-ring);
1670
+ }
1671
+
1672
+ /* CSS output */
1673
+ ry-gradient-picker [data-ry-target="output"] {
1674
+ font-family: var(--ry-font-mono);
1675
+ font-size: var(--ry-text-xs);
1676
+ color: var(--ry-color-text);
1677
+ background-color: var(--ry-color-bg-subtle);
1678
+ border: var(--ry-border-width) solid var(--ry-color-border);
1679
+ border-radius: var(--ry-radius-sm);
1680
+ transition: border-color var(--ry-duration-fast) var(--ry-ease),
1681
+ box-shadow var(--ry-duration-fast) var(--ry-ease);
1682
+ }
1683
+
1684
+ ry-gradient-picker [data-ry-target="output"]:focus {
1685
+ outline: none;
1686
+ border-color: var(--ry-color-primary);
1687
+ box-shadow: var(--ry-focus-ring);
1688
+ }
1689
+
1690
+ /* Copy button */
1691
+ ry-gradient-picker [data-ry-target="copy-btn"] {
1692
+ background-color: transparent;
1693
+ color: var(--ry-color-text-muted);
1694
+ border-radius: var(--ry-radius-sm);
1695
+ transition: background-color var(--ry-duration-fast) var(--ry-ease),
1696
+ color var(--ry-duration-fast) var(--ry-ease);
1697
+ }
1698
+
1699
+ ry-gradient-picker [data-ry-target="copy-btn"]:hover {
1700
+ background-color: var(--ry-color-bg-subtle);
1701
+ color: var(--ry-color-text);
1702
+ }
1703
+
1704
+ ry-gradient-picker [data-ry-target="copy-btn"][data-copied] {
1705
+ color: var(--ry-color-success);
1706
+ }
1707
+
1708
+ /* ═══════════════════════════════════════════════════════════════
1709
+ TREE
1710
+ ═══════════════════════════════════════════════════════════════ */
1711
+
1712
+ ry-tree {
1713
+ border: var(--ry-border-width) solid var(--ry-color-border);
1714
+ border-radius: var(--ry-radius-lg);
1715
+ padding: var(--ry-space-6);
1716
+ background-color: var(--ry-color-bg);
1717
+ box-shadow: var(--ry-shadow-sm);
1718
+ }
1719
+
1720
+ /* Vertical connector line */
1721
+ .ry-tree__children {
1722
+ border-left: 1px solid var(--ry-color-border);
1723
+ }
1724
+
1725
+ /* Horizontal connector line */
1726
+ .ry-tree__children .ry-tree__item::before {
1727
+ background-color: var(--ry-color-border);
1728
+ }
1729
+
1730
+ .ry-tree__label,
1731
+ .ry-tree__file {
1732
+ font-family: var(--ry-font-sans);
1733
+ font-size: var(--ry-text-sm);
1734
+ color: var(--ry-color-text);
1735
+ border-radius: var(--ry-radius-sm);
1736
+ transition: background-color var(--ry-duration-fast) var(--ry-ease);
1737
+ }
1738
+
1739
+ .ry-tree__label:hover,
1740
+ .ry-tree__file:hover {
1741
+ background-color: var(--ry-color-bg-muted);
1742
+ }
1743
+
1744
+ .ry-tree__file[data-ry-selected] {
1745
+ background-color: var(--ry-color-bg-muted);
1746
+ color: var(--ry-color-text);
1747
+ font-weight: var(--ry-font-medium);
1748
+ }
1749
+
1750
+ .ry-tree__icon {
1751
+ color: var(--ry-color-text-muted);
1752
+ }
1753
+
1754
+ /* Open folder icon gets stronger color */
1755
+ .ry-tree__toggle:checked ~ .ry-tree__label .ry-tree__icon {
1756
+ color: var(--ry-color-text);
1757
+ }
1758
+
1759
+ /* Exclude tree toggle checkboxes from global checkbox styling */
1760
+ input[type="checkbox"].ry-tree__toggle {
1761
+ background: none;
1762
+ border: none;
1763
+ box-shadow: none;
1764
+ }
1765
+
1766
+ input[type="checkbox"].ry-tree__toggle::after {
1767
+ display: none;
1768
+ }
1769
+
1770
+ /* ── Drag and Drop ── */
1771
+
1772
+ .ry-tree__ghost {
1773
+ background-color: var(--ry-color-bg);
1774
+ border: var(--ry-border-width) solid var(--ry-color-primary);
1775
+ border-radius: var(--ry-radius-sm);
1776
+ box-shadow: var(--ry-shadow-lg);
1777
+ opacity: 0.85;
1778
+ }
1779
+
1780
+ .ry-tree__item--collapsed {
1781
+ background-color: color-mix(in srgb, var(--ry-color-primary) 10%, transparent);
1782
+ border-radius: var(--ry-radius-sm);
1783
+ }
1784
+
1785
+ .ry-tree__item[data-ry-drop-target="before"]::after,
1786
+ .ry-tree__item[data-ry-drop-target="after"]::after {
1787
+ background-color: var(--ry-color-primary);
1788
+ }
1789
+
1790
+ .ry-tree__item[data-ry-drop-target="inside"] > .ry-tree__label {
1791
+ background-color: var(--ry-color-primary);
1792
+ color: var(--ry-color-text-inverse);
1793
+ border-radius: var(--ry-radius-sm);
1794
+ }
1795
+
1796
+ .ry-tree__item[data-ry-drop-target="inside"] > .ry-tree__label .ry-tree__icon {
1797
+ color: var(--ry-color-text-inverse);
1798
+ }
@@ -154,7 +154,8 @@ ry-card, ry-accordion, ry-modal, ry-tabs, ry-dropdown,
154
154
  ry-button, ry-badge, ry-alert, ry-field, ry-nav, ry-logo, ry-actions,
155
155
  ry-accordion-item, ry-tab, ry-menu, ry-menu-item, ry-divider,
156
156
  ry-theme-toggle, ry-select, ry-switch, ry-tooltip, ry-drawer, ry-toast,
157
- ry-toggle-button, ry-knob, ry-slider, ry-color-picker, ry-color-input {
157
+ ry-toggle-button, ry-knob, ry-slider, ry-number-select, ry-color-picker, ry-color-input,
158
+ ry-gradient-picker, ry-tree, ry-tree-item {
158
159
  box-sizing: border-box;
159
160
  }
160
161
 
@@ -332,6 +333,31 @@ ry-knob [data-ry-target="label"] { display: block; text-align: center; }
332
333
  ry-knob[size="sm"] [data-ry-target="ring"] { --knob-size: 48px; }
333
334
  ry-knob[size="lg"] [data-ry-target="ring"] { --knob-size: 80px; }
334
335
 
336
+ /* Number Select */
337
+ ry-number-select { display: inline-flex; align-items: center; gap: 0; user-select: none; touch-action: none; }
338
+ ry-number-select[disabled] { pointer-events: none; }
339
+ ry-number-select [data-ry-target="decrement"], ry-number-select [data-ry-target="increment"] { display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 36px; padding: 0; flex-shrink: 0; cursor: pointer; }
340
+ ry-number-select [data-ry-target="decrement"] svg, ry-number-select [data-ry-target="increment"] svg { width: 16px; height: 16px; }
341
+ ry-number-select [data-ry-target="display"] { display: inline-flex; align-items: center; justify-content: center; min-width: 48px; height: 36px; padding: 0 var(--ry-space-2, 0.5rem); position: relative; cursor: ew-resize; outline: none; }
342
+ ry-number-select[drag="y"] [data-ry-target="display"], ry-number-select[arrows="stacked"]:not([drag]) [data-ry-target="display"] { cursor: ns-resize; }
343
+ ry-number-select[drag="none"] [data-ry-target="display"] { cursor: default; }
344
+ ry-number-select[data-dragging] { cursor: ew-resize; }
345
+ ry-number-select[drag="y"][data-dragging], ry-number-select[arrows="stacked"]:not([drag])[data-dragging] { cursor: ns-resize; }
346
+ ry-number-select [data-ry-target="value"] { display: inline-block; min-width: 2em; text-align: center; transition: transform 60ms ease-out; }
347
+ ry-number-select [data-ry-target="prefix"], ry-number-select [data-ry-target="suffix"] { flex-shrink: 0; pointer-events: none; }
348
+ ry-number-select [data-ry-target="input"] { display: none; position: absolute; inset: 0; width: 100%; height: 100%; text-align: center; padding: 0 var(--ry-space-1, 0.25rem); outline: none; }
349
+ ry-number-select [data-ry-target="label"] { display: block; text-align: center; margin-right: var(--ry-space-2, 0.5rem); order: -1; }
350
+ ry-number-select[arrows="stacked"] { flex-direction: column; align-items: stretch; }
351
+ ry-number-select[arrows="stacked"] [data-ry-target="decrement"], ry-number-select[arrows="stacked"] [data-ry-target="increment"] { width: auto; height: 24px; }
352
+ ry-number-select[arrows="stacked"] [data-ry-target="decrement"] svg, ry-number-select[arrows="stacked"] [data-ry-target="increment"] svg { width: 14px; height: 14px; }
353
+ ry-number-select[size="xs"] [data-ry-target="decrement"], ry-number-select[size="xs"] [data-ry-target="increment"] { width: 20px; height: 22px; }
354
+ ry-number-select[size="xs"] [data-ry-target="display"] { min-width: 28px; height: 22px; padding: 0 var(--ry-space-1, 0.25rem); }
355
+ ry-number-select[size="xs"] [data-ry-target="decrement"] svg, ry-number-select[size="xs"] [data-ry-target="increment"] svg { width: 12px; height: 12px; }
356
+ ry-number-select[size="sm"] [data-ry-target="decrement"], ry-number-select[size="sm"] [data-ry-target="increment"] { width: 24px; height: 28px; }
357
+ ry-number-select[size="sm"] [data-ry-target="display"] { min-width: 36px; height: 28px; }
358
+ ry-number-select[size="lg"] [data-ry-target="decrement"], ry-number-select[size="lg"] [data-ry-target="increment"] { width: 40px; height: 44px; }
359
+ ry-number-select[size="lg"] [data-ry-target="display"] { min-width: 60px; height: 44px; }
360
+
335
361
  /* Slider */
336
362
  ry-slider { display: block; position: relative; padding: var(--ry-space-4) 0; touch-action: none; user-select: none; }
337
363
  ry-slider[disabled] { pointer-events: none; }
@@ -461,11 +487,9 @@ ry-dropdown [data-ry-target="menu"], ry-dropdown ry-menu {
461
487
  transform: translateY(-0.5rem);
462
488
  transition: opacity var(--ry-duration-fast) var(--ry-ease), visibility var(--ry-duration-fast) var(--ry-ease), transform var(--ry-duration-fast) var(--ry-ease);
463
489
  }
464
- ry-dropdown[data-ry-state="open"] [data-ry-target="menu"], ry-dropdown[data-ry-state="open"] ry-menu {
465
- opacity: 1;
466
- visibility: visible;
467
- transform: translateY(0);
468
- }
490
+ ry-dropdown[data-ry-state="open"] [data-ry-target="menu"], ry-dropdown[data-ry-state="open"] ry-menu { opacity: 1; visibility: visible; transform: translateY(0); }
491
+ ry-dropdown[data-ry-position="top"] [data-ry-target="menu"], ry-dropdown[data-ry-position="top"] ry-menu { top: auto; bottom: 100%; margin-top: 0; margin-bottom: var(--ry-space-1, 0.25rem); transform: translateY(0.5rem); }
492
+ ry-dropdown[data-ry-position="top"][data-ry-state="open"] [data-ry-target="menu"], ry-dropdown[data-ry-position="top"][data-ry-state="open"] ry-menu { transform: translateY(0); }
469
493
  ry-menu-item {
470
494
  display: block;
471
495
  width: 100%;
@@ -732,6 +756,58 @@ ry-color-input[data-ry-position="top"] [data-ry-target="panel"] { bottom: 100%;
732
756
  ry-color-input[data-ry-state="open"][data-ry-position] [data-ry-target="panel"] { opacity: 1; visibility: visible; pointer-events: auto; transform: translateY(0); transition: opacity var(--ry-duration-fast) var(--ry-ease), transform var(--ry-duration-fast) var(--ry-ease); }
733
757
  ry-color-input ry-color-picker[inline] [data-ry-target="panel"] { border: none; box-shadow: none; }
734
758
 
759
+ /* Gradient Picker */
760
+ ry-gradient-picker { display: block; width: var(--ry-color-picker-width, 240px); }
761
+ ry-gradient-picker[disabled] { pointer-events: none; }
762
+ ry-gradient-picker [data-ry-target="controls"] { display: flex; align-items: center; gap: var(--ry-space-3, 0.75rem); padding: var(--ry-space-3, 0.75rem); }
763
+ ry-gradient-picker [data-ry-target="type-toggle"] { display: flex; gap: var(--ry-space-1, 0.25rem); }
764
+ ry-gradient-picker [data-ry-target="type-toggle"] button { display: flex; align-items: center; justify-content: center; width: 28px; height: 28px; padding: 0; border: none; cursor: pointer; }
765
+ ry-gradient-picker [data-ry-target="type-toggle"] button svg { width: 16px; height: 16px; }
766
+ ry-gradient-picker [data-ry-target="angle-control"] { display: flex; align-items: center; gap: var(--ry-space-1, 0.25rem); margin-left: auto; }
767
+ ry-gradient-picker [data-ry-target="angle-control"] ry-number-select { min-width: 0; }
768
+ ry-gradient-picker [data-ry-target="shape-control"] { display: none; gap: var(--ry-space-1, 0.25rem); margin-left: auto; }
769
+ ry-gradient-picker [data-ry-target="shape-control"] button { display: flex; align-items: center; justify-content: center; width: 28px; height: 28px; padding: 0; border: none; cursor: pointer; }
770
+ ry-gradient-picker [data-ry-target="shape-control"] button svg { width: 16px; height: 16px; }
771
+ ry-gradient-picker[data-ry-type="radial"] [data-ry-target="angle-control"] { display: none; }
772
+ ry-gradient-picker[data-ry-type="radial"] [data-ry-target="shape-control"] { display: flex; }
773
+ ry-gradient-picker[data-ry-type="solid"] [data-ry-target="bar-container"] { display: none; }
774
+ ry-gradient-picker[data-ry-type="solid"] [data-ry-target="angle-control"] { display: none; }
775
+ ry-gradient-picker[data-ry-type="solid"] [data-ry-target="shape-control"] { display: none; }
776
+ ry-gradient-picker [data-ry-target="bar-container"] { position: relative; margin: 0 10px; padding: var(--ry-space-4, 1rem) 0; }
777
+ ry-gradient-picker [data-ry-target="bar"] { position: relative; height: var(--ry-gradient-picker-bar-height, 24px); cursor: pointer; touch-action: none; }
778
+ ry-gradient-picker [data-ry-target="stop"] { position: absolute; top: 50%; width: var(--ry-gradient-picker-stop-size, 16px); height: var(--ry-gradient-picker-stop-size, 16px); transform: translate(-50%, -50%); cursor: grab; z-index: 1; }
779
+ ry-gradient-picker [data-ry-target="stop"]:active { cursor: grabbing; }
780
+ ry-gradient-picker [data-ry-target="stop"][data-selected] { z-index: 2; width: calc(var(--ry-gradient-picker-stop-size, 16px) + 4px); height: calc(var(--ry-gradient-picker-stop-size, 16px) + 4px); }
781
+ ry-gradient-picker ry-color-picker[inline] [data-ry-target="panel"] { border: none; box-shadow: none; }
782
+ ry-gradient-picker [data-ry-target="output-row"] { display: flex; align-items: center; gap: var(--ry-space-1, 0.25rem); padding: 0 var(--ry-space-3, 0.75rem) var(--ry-space-3, 0.75rem); }
783
+ ry-gradient-picker [data-ry-target="output"] { flex: 1; min-width: 0; padding: var(--ry-space-1, 0.25rem) var(--ry-space-2, 0.5rem); border: none; }
784
+ ry-gradient-picker [data-ry-target="copy-btn"] { display: flex; align-items: center; justify-content: center; flex-shrink: 0; width: 28px; height: 28px; padding: 0; border: none; cursor: pointer; }
785
+ ry-gradient-picker [data-ry-target="copy-btn"] svg { width: 14px; height: 14px; }
786
+
787
+ /* Tree */
788
+ ry-tree { display: block; }
789
+ ry-tree-item { display: none; }
790
+ .ry-tree__root, .ry-tree__children { list-style: none; padding: 0; margin: 0; }
791
+ .ry-tree__children { margin-left: 11px; padding-left: 11px; overflow: hidden; }
792
+ .ry-tree__item { position: relative; margin-top: var(--ry-space-1, 0.25rem); }
793
+ .ry-tree__children .ry-tree__item::before { content: ""; position: absolute; left: -11px; top: 14px; width: 11px; height: 1px; }
794
+ .ry-tree__label, .ry-tree__file { display: flex; align-items: center; gap: var(--ry-space-2, 0.5rem); padding: var(--ry-space-1, 0.25rem) var(--ry-space-2, 0.5rem); height: 28px; cursor: pointer; user-select: none; text-decoration: none; }
795
+ input[type="checkbox"].ry-tree__toggle { display: none; appearance: auto; width: 0; height: 0; margin: 0; padding: 0; border: none; }
796
+ .ry-tree__icon-open { display: none; }
797
+ .ry-tree__icon-closed { display: flex; }
798
+ .ry-tree__toggle:checked ~ .ry-tree__label .ry-tree__icon-open { display: flex; }
799
+ .ry-tree__toggle:checked ~ .ry-tree__label .ry-tree__icon-closed { display: none; }
800
+ .ry-tree__children-wrapper { display: grid; grid-template-rows: 0fr; transition: grid-template-rows var(--ry-tree-duration, 150ms) var(--ry-ease, ease); }
801
+ ry-tree[no-animate] .ry-tree__children-wrapper { transition-duration: 0ms; }
802
+ .ry-tree__toggle:checked ~ .ry-tree__children-wrapper { grid-template-rows: 1fr; }
803
+ .ry-tree__icon { width: 16px; height: 16px; flex-shrink: 0; }
804
+ .ry-tree__ghost { position: fixed; pointer-events: none; user-select: none; z-index: var(--ry-z-toast, 1080); transform: rotate(-2deg); }
805
+ .ry-tree__item[data-ry-dragging] { opacity: 0.4; }
806
+ .ry-tree__item--collapsed { height: 4px; overflow: hidden; pointer-events: none; }
807
+ .ry-tree__item[data-ry-drop-target="before"]::after, .ry-tree__item[data-ry-drop-target="after"]::after { content: ''; position: absolute; left: 0; right: 0; height: 2px; pointer-events: none; }
808
+ .ry-tree__item[data-ry-drop-target="before"]::after { top: -1px; }
809
+ .ry-tree__item[data-ry-drop-target="after"]::after { bottom: -1px; }
810
+
735
811
  /* ═══════════════════════════════════════════════════════════════════════════
736
812
  PART 3: THEME
737
813
  Visual styling - colors, shadows, borders, typography decoration.
@@ -898,6 +974,31 @@ ry-knob[color="warning"] [data-ry-target="indicator"] { background-color: var(--
898
974
  ry-knob[color="danger"] [data-ry-target="ring"] { background: conic-gradient(from 225deg, var(--ry-color-danger) calc(var(--knob-percent) * 270deg), var(--ry-color-bg-muted) calc(var(--knob-percent) * 270deg)); }
899
975
  ry-knob[color="danger"] [data-ry-target="indicator"] { background-color: var(--ry-color-danger); }
900
976
 
977
+ /* Number Select */
978
+ .ry-number-select__btn { background: var(--ry-color-bg); border: var(--ry-border-width) solid var(--ry-color-border); color: var(--ry-color-text); transition: background-color var(--ry-duration-fast) var(--ry-ease), border-color var(--ry-duration-fast) var(--ry-ease); }
979
+ .ry-number-select__btn:hover { background-color: var(--ry-color-bg-muted); border-color: var(--ry-color-border-strong); }
980
+ .ry-number-select__btn:active { background-color: var(--ry-color-bg-subtle); }
981
+ .ry-number-select__decrement { border-radius: var(--ry-radius-md) 0 0 var(--ry-radius-md); border-right: none; }
982
+ .ry-number-select__increment { border-radius: 0 var(--ry-radius-md) var(--ry-radius-md) 0; border-left: none; }
983
+ ry-number-select[arrows="start"] .ry-number-select__decrement { border-radius: var(--ry-radius-md); border-right: var(--ry-border-width) solid var(--ry-color-border); }
984
+ ry-number-select[arrows="end"] .ry-number-select__increment { border-radius: var(--ry-radius-md); border-left: var(--ry-border-width) solid var(--ry-color-border); }
985
+ .ry-number-select__display { background-color: var(--ry-color-bg); border-top: var(--ry-border-width) solid var(--ry-color-border); border-bottom: var(--ry-border-width) solid var(--ry-color-border); }
986
+ ry-number-select:not([arrows]) .ry-number-select__display, ry-number-select[arrows="both"] .ry-number-select__display { border-left: none; border-right: none; }
987
+ ry-number-select[arrows="none"] .ry-number-select__display { border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-md); }
988
+ ry-number-select[arrows="start"] .ry-number-select__display { border-right: var(--ry-border-width) solid var(--ry-color-border); border-left: none; border-radius: 0 var(--ry-radius-md) var(--ry-radius-md) 0; }
989
+ ry-number-select[arrows="end"] .ry-number-select__display { border-left: var(--ry-border-width) solid var(--ry-color-border); border-right: none; border-radius: var(--ry-radius-md) 0 0 var(--ry-radius-md); }
990
+ ry-number-select[arrows="stacked"] .ry-number-select__increment { border: var(--ry-border-width) solid var(--ry-color-border); border-bottom: none; border-radius: var(--ry-radius-md) var(--ry-radius-md) 0 0; }
991
+ ry-number-select[arrows="stacked"] .ry-number-select__decrement { border: var(--ry-border-width) solid var(--ry-color-border); border-top: none; border-radius: 0 0 var(--ry-radius-md) var(--ry-radius-md); }
992
+ ry-number-select[arrows="stacked"] .ry-number-select__display { border: var(--ry-border-width) solid var(--ry-color-border); border-top: none; border-bottom: none; border-radius: 0; }
993
+ .ry-number-select__value { font-family: var(--ry-font-mono); font-size: var(--ry-text-sm); font-weight: var(--ry-font-medium); color: var(--ry-color-text); }
994
+ .ry-number-select__input { font-family: var(--ry-font-mono); font-size: var(--ry-text-sm); font-weight: var(--ry-font-medium); color: var(--ry-color-text); background: transparent; border: none; border-bottom: 2px solid var(--ry-color-primary); }
995
+ .ry-number-select__display:focus-visible { outline: none; box-shadow: var(--ry-focus-ring); border-color: var(--ry-color-primary); }
996
+ .ry-number-select__affix { font-family: var(--ry-font-mono); font-size: var(--ry-text-sm); color: var(--ry-color-text-muted); }
997
+ .ry-number-select__label { font-size: var(--ry-text-sm); color: var(--ry-color-text-muted); }
998
+ ry-number-select[disabled] { opacity: 0.5; }
999
+ ry-number-select[size="xs"] .ry-number-select__value { font-size: var(--ry-text-xs); }
1000
+ ry-number-select[size="xs"] .ry-number-select__affix { font-size: var(--ry-text-xs); }
1001
+
901
1002
  /* Cards */
902
1003
  ry-card {
903
1004
  background-color: var(--ry-color-bg);
@@ -1213,3 +1314,39 @@ ry-color-input [data-ry-target="input"] { font-family: var(--ry-font-mono); font
1213
1314
  ry-color-input [data-ry-target="input"]:focus { outline: none; }
1214
1315
  ry-color-input [data-ry-target="input"]::placeholder { color: var(--ry-color-text-muted); }
1215
1316
  ry-color-input [data-ry-target="panel"] { background-color: var(--ry-color-bg); border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-lg); box-shadow: var(--ry-shadow-lg); }
1317
+
1318
+ /* Gradient Picker */
1319
+ ry-gradient-picker { background-color: var(--ry-color-bg); border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-lg); box-shadow: var(--ry-shadow-md); }
1320
+ ry-gradient-picker[disabled] { opacity: 0.5; }
1321
+ ry-gradient-picker [data-ry-target="type-toggle"] button { font-family: var(--ry-font-sans); font-size: var(--ry-text-xs); background-color: transparent; color: var(--ry-color-text-muted); border-radius: var(--ry-radius-sm); transition: background-color var(--ry-duration-fast) var(--ry-ease), color var(--ry-duration-fast) var(--ry-ease); }
1322
+ ry-gradient-picker [data-ry-target="type-toggle"] button:hover { background-color: var(--ry-color-bg-subtle); }
1323
+ ry-gradient-picker [data-ry-target="type-toggle"] button[data-active] { background-color: var(--ry-color-primary); color: var(--ry-color-text-inverse); }
1324
+ ry-gradient-picker [data-ry-target="shape-control"] button { font-family: var(--ry-font-sans); font-size: var(--ry-text-xs); background-color: transparent; color: var(--ry-color-text-muted); border-radius: var(--ry-radius-sm); transition: background-color var(--ry-duration-fast) var(--ry-ease), color var(--ry-duration-fast) var(--ry-ease); }
1325
+ ry-gradient-picker [data-ry-target="shape-control"] button:hover { background-color: var(--ry-color-bg-subtle); }
1326
+ ry-gradient-picker [data-ry-target="shape-control"] button[data-active] { background-color: var(--ry-color-primary); color: var(--ry-color-text-inverse); }
1327
+ ry-gradient-picker [data-ry-target="bar"] { border-radius: var(--ry-radius-full, 9999px); box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); }
1328
+ ry-gradient-picker [data-ry-target="stop"] { background-color: var(--stop-color, #fff); border: 2px solid #fff; border-radius: var(--ry-radius-full); box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.3), var(--ry-shadow-sm); transition: transform var(--ry-duration-fast) var(--ry-ease), opacity var(--ry-duration-fast) var(--ry-ease); }
1329
+ ry-gradient-picker [data-ry-target="stop"][data-selected] { box-shadow: 0 0 0 2px var(--ry-color-primary), var(--ry-shadow-md); }
1330
+ ry-gradient-picker [data-ry-target="stop"]:focus-visible { outline: none; box-shadow: 0 0 0 2px var(--ry-color-primary), var(--ry-focus-ring); }
1331
+ ry-gradient-picker [data-ry-target="output"] { font-family: var(--ry-font-mono); font-size: var(--ry-text-xs); color: var(--ry-color-text); background-color: var(--ry-color-bg-subtle); border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-sm); transition: border-color var(--ry-duration-fast) var(--ry-ease), box-shadow var(--ry-duration-fast) var(--ry-ease); }
1332
+ ry-gradient-picker [data-ry-target="output"]:focus { outline: none; border-color: var(--ry-color-primary); box-shadow: var(--ry-focus-ring); }
1333
+ ry-gradient-picker [data-ry-target="copy-btn"] { background-color: transparent; color: var(--ry-color-text-muted); border-radius: var(--ry-radius-sm); transition: background-color var(--ry-duration-fast) var(--ry-ease), color var(--ry-duration-fast) var(--ry-ease); }
1334
+ ry-gradient-picker [data-ry-target="copy-btn"]:hover { background-color: var(--ry-color-bg-subtle); color: var(--ry-color-text); }
1335
+ ry-gradient-picker [data-ry-target="copy-btn"][data-copied] { color: var(--ry-color-success); }
1336
+
1337
+ /* Tree */
1338
+ ry-tree { border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-lg); padding: var(--ry-space-6); background-color: var(--ry-color-bg); box-shadow: var(--ry-shadow-sm); }
1339
+ .ry-tree__children { border-left: 1px solid var(--ry-color-border); }
1340
+ .ry-tree__children .ry-tree__item::before { background-color: var(--ry-color-border); }
1341
+ .ry-tree__label, .ry-tree__file { font-family: var(--ry-font-sans); font-size: var(--ry-text-sm); color: var(--ry-color-text); border-radius: var(--ry-radius-sm); transition: background-color var(--ry-duration-fast) var(--ry-ease); }
1342
+ .ry-tree__label:hover, .ry-tree__file:hover { background-color: var(--ry-color-bg-muted); }
1343
+ .ry-tree__file[data-ry-selected] { background-color: var(--ry-color-bg-muted); color: var(--ry-color-text); font-weight: var(--ry-font-medium); }
1344
+ .ry-tree__icon { color: var(--ry-color-text-muted); }
1345
+ .ry-tree__toggle:checked ~ .ry-tree__label .ry-tree__icon { color: var(--ry-color-text); }
1346
+ input[type="checkbox"].ry-tree__toggle { background: none; border: none; box-shadow: none; }
1347
+ input[type="checkbox"].ry-tree__toggle::after { display: none; }
1348
+ .ry-tree__ghost { background-color: var(--ry-color-bg); border: var(--ry-border-width) solid var(--ry-color-primary); border-radius: var(--ry-radius-sm); box-shadow: var(--ry-shadow-lg); opacity: 0.85; }
1349
+ .ry-tree__item--collapsed { background-color: color-mix(in srgb, var(--ry-color-primary) 10%, transparent); border-radius: var(--ry-radius-sm); }
1350
+ .ry-tree__item[data-ry-drop-target="before"]::after, .ry-tree__item[data-ry-drop-target="after"]::after { background-color: var(--ry-color-primary); }
1351
+ .ry-tree__item[data-ry-drop-target="inside"] > .ry-tree__label { background-color: var(--ry-color-primary); color: var(--ry-color-text-inverse); border-radius: var(--ry-radius-sm); }
1352
+ .ry-tree__item[data-ry-drop-target="inside"] > .ry-tree__label .ry-tree__icon { color: var(--ry-color-text-inverse); }
package/dist/ry-ui.d.ts CHANGED
@@ -41,9 +41,14 @@ export { RyIcon } from './components/ry-icon.js';
41
41
  export { RyToggleButton } from './components/ry-toggle-button.js';
42
42
  export { RySlider } from './components/ry-slider.js';
43
43
  export { RyKnob } from './components/ry-knob.js';
44
+ export { RyNumberSelect } from './components/ry-number-select.js';
44
45
  export { RyColorPicker } from './components/ry-color-picker.js';
45
46
  export type { ColorFormat, RGB, HSL, HSV } from './components/ry-color-picker.js';
46
47
  export { RyColorInput } from './components/ry-color-input.js';
48
+ export { RyGradientPicker } from './components/ry-gradient-picker.js';
49
+ export type { GradientStop, GradientType, RadialShape } from './components/ry-gradient-picker.js';
50
+ export { RyTree, RyTreeItem } from './components/ry-tree.js';
51
+ export type { TreeNode } from './components/ry-tree.js';
47
52
  export { getIcon, registerIcon, registerIcons, getIconNames } from './core/ry-icons.js';
48
53
  import { RyToast as _RyToast } from './components/ry-toast.js';
49
54
  declare global {
@@ -1 +1 @@
1
- {"version":3,"file":"ry-ui.d.ts","sourceRoot":"","sources":["../src/ts/ry-ui.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,YAAY,EACV,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,YAAY,EACb,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAGtE,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,YAAY,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,iCAAiC,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAG9D,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGxF,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,OAAO,EAAE,OAAO,QAAQ,CAAC;KAC1B;CACF"}
1
+ {"version":3,"file":"ry-ui.d.ts","sourceRoot":"","sources":["../src/ts/ry-ui.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,YAAY,EACV,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,YAAY,EACb,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAGtE,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,YAAY,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,iCAAiC,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAClG,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAGxD,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGxF,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,OAAO,EAAE,OAAO,QAAQ,CAAC;KAC1B;CACF"}