@usevyre/react 1.0.3 → 1.2.0

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.
@@ -2509,3 +2509,1355 @@
2509
2509
  overflow: auto;
2510
2510
  padding: var(--vyre-spacing-6);
2511
2511
  }
2512
+
2513
+ /* ── BUTTON GROUP ────────────────────────────────────────────── */
2514
+ .vyre-btn-group {
2515
+ display: inline-flex;
2516
+ flex-direction: row;
2517
+ align-items: center;
2518
+ gap: var(--vyre-spacing-2);
2519
+ }
2520
+
2521
+ .vyre-btn-group--vertical {
2522
+ flex-direction: column;
2523
+ align-items: stretch;
2524
+ }
2525
+
2526
+ /* Attached: collapse borders between buttons */
2527
+ .vyre-btn-group--attached {
2528
+ gap: 0;
2529
+ }
2530
+
2531
+ .vyre-btn-group--attached .vyre-btn {
2532
+ border-radius: 0;
2533
+ position: relative;
2534
+ }
2535
+
2536
+ /* Collapse duplicate borders */
2537
+ .vyre-btn-group--attached .vyre-btn + .vyre-btn {
2538
+ margin-left: -1px;
2539
+ }
2540
+
2541
+ .vyre-btn-group--attached.vyre-btn-group--vertical .vyre-btn + .vyre-btn {
2542
+ margin-left: 0;
2543
+ margin-top: -1px;
2544
+ }
2545
+
2546
+ /* Restore radius on first/last child */
2547
+ .vyre-btn-group--attached:not(.vyre-btn-group--vertical) .vyre-btn:first-child {
2548
+ border-top-left-radius: var(--vyre-border-radius-md);
2549
+ border-bottom-left-radius: var(--vyre-border-radius-md);
2550
+ }
2551
+
2552
+ .vyre-btn-group--attached:not(.vyre-btn-group--vertical) .vyre-btn:last-child {
2553
+ border-top-right-radius: var(--vyre-border-radius-md);
2554
+ border-bottom-right-radius: var(--vyre-border-radius-md);
2555
+ }
2556
+
2557
+ .vyre-btn-group--attached.vyre-btn-group--vertical .vyre-btn:first-child {
2558
+ border-top-left-radius: var(--vyre-border-radius-md);
2559
+ border-top-right-radius: var(--vyre-border-radius-md);
2560
+ }
2561
+
2562
+ .vyre-btn-group--attached.vyre-btn-group--vertical .vyre-btn:last-child {
2563
+ border-bottom-left-radius: var(--vyre-border-radius-md);
2564
+ border-bottom-right-radius: var(--vyre-border-radius-md);
2565
+ }
2566
+
2567
+ /* Raise hovered/focused button above its neighbors */
2568
+ .vyre-btn-group--attached .vyre-btn:hover,
2569
+ .vyre-btn-group--attached .vyre-btn:focus-visible {
2570
+ z-index: 1;
2571
+ }
2572
+
2573
+ /* ── TAGS INPUT ──────────────────────────────────────────────── */
2574
+ .vyre-tags-input {
2575
+ display: flex;
2576
+ flex-wrap: wrap;
2577
+ align-items: center;
2578
+ gap: var(--vyre-spacing-1);
2579
+ padding: var(--vyre-spacing-2) var(--vyre-spacing-3);
2580
+ background: var(--vyre-color-semantic-surface);
2581
+ border: 1px solid var(--vyre-color-semantic-border);
2582
+ border-radius: var(--vyre-border-radius-md);
2583
+ cursor: text;
2584
+ min-height: 2.5rem;
2585
+ transition: border-color var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out),
2586
+ box-shadow var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
2587
+ }
2588
+
2589
+ .vyre-tags-input:focus-within {
2590
+ border-color: var(--vyre-color-semantic-accent);
2591
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--vyre-color-semantic-accent) 15%, transparent);
2592
+ outline: none;
2593
+ }
2594
+
2595
+ .vyre-tags-input--disabled {
2596
+ opacity: 0.5;
2597
+ cursor: not-allowed;
2598
+ pointer-events: none;
2599
+ }
2600
+
2601
+ /* Sizes */
2602
+ .vyre-tags-input--sm {
2603
+ padding: var(--vyre-spacing-1) var(--vyre-spacing-2);
2604
+ min-height: 2rem;
2605
+ font-size: var(--vyre-typography-font-size-xs);
2606
+ }
2607
+
2608
+ .vyre-tags-input--lg {
2609
+ padding: var(--vyre-spacing-3) var(--vyre-spacing-4);
2610
+ min-height: 3rem;
2611
+ font-size: var(--vyre-typography-font-size-md);
2612
+ }
2613
+
2614
+ /* Tag chip */
2615
+ .vyre-tag {
2616
+ display: inline-flex;
2617
+ align-items: center;
2618
+ gap: var(--vyre-spacing-1);
2619
+ padding: 2px var(--vyre-spacing-2);
2620
+ background: var(--vyre-color-semantic-surface-raised);
2621
+ border: 1px solid var(--vyre-color-semantic-border);
2622
+ border-radius: var(--vyre-border-radius-full);
2623
+ font-size: var(--vyre-typography-font-size-xs);
2624
+ font-family: var(--vyre-typography-font-family-body);
2625
+ color: var(--vyre-color-semantic-text-primary);
2626
+ white-space: nowrap;
2627
+ line-height: 1.5;
2628
+ }
2629
+
2630
+ .vyre-tag__label {
2631
+ max-width: 12rem;
2632
+ overflow: hidden;
2633
+ text-overflow: ellipsis;
2634
+ white-space: nowrap;
2635
+ }
2636
+
2637
+ .vyre-tag__remove {
2638
+ display: inline-flex;
2639
+ align-items: center;
2640
+ justify-content: center;
2641
+ width: 14px;
2642
+ height: 14px;
2643
+ padding: 0;
2644
+ border: none;
2645
+ background: none;
2646
+ border-radius: var(--vyre-border-radius-full);
2647
+ cursor: pointer;
2648
+ color: var(--vyre-color-semantic-text-muted);
2649
+ flex-shrink: 0;
2650
+ transition: color 100ms, background 100ms;
2651
+ }
2652
+
2653
+ .vyre-tag__remove:hover {
2654
+ color: var(--vyre-color-semantic-danger);
2655
+ background: var(--vyre-color-semantic-danger-subtle);
2656
+ }
2657
+
2658
+ .vyre-tag__remove:focus-visible {
2659
+ outline: 2px solid var(--vyre-color-semantic-accent);
2660
+ outline-offset: 1px;
2661
+ }
2662
+
2663
+ .vyre-tag__remove:disabled {
2664
+ cursor: not-allowed;
2665
+ opacity: 0.5;
2666
+ }
2667
+
2668
+ /* Tag variants */
2669
+ .vyre-tag--default {
2670
+ background: var(--vyre-color-semantic-surface-raised);
2671
+ color: var(--vyre-color-semantic-text-secondary);
2672
+ border-color: var(--vyre-color-semantic-border);
2673
+ }
2674
+
2675
+ .vyre-tag--accent {
2676
+ background: var(--vyre-color-semantic-accent-subtle);
2677
+ color: var(--vyre-color-semantic-accent);
2678
+ border-color: var(--vyre-color-semantic-accent-subtle-border);
2679
+ }
2680
+
2681
+ .vyre-tag--danger {
2682
+ background: var(--vyre-color-semantic-danger-subtle);
2683
+ color: var(--vyre-color-semantic-danger);
2684
+ border-color: var(--vyre-color-semantic-danger-subtle-border);
2685
+ }
2686
+
2687
+ /* Tag sizes */
2688
+ .vyre-tag--sm {
2689
+ padding: 1px var(--vyre-spacing-2);
2690
+ font-size: var(--vyre-typography-font-size-2xs);
2691
+ }
2692
+
2693
+ .vyre-tag--md {
2694
+ padding: 2px var(--vyre-spacing-2);
2695
+ font-size: var(--vyre-typography-font-size-xs);
2696
+ }
2697
+
2698
+ .vyre-tag--lg {
2699
+ padding: var(--vyre-spacing-1) var(--vyre-spacing-3);
2700
+ font-size: var(--vyre-typography-font-size-sm);
2701
+ }
2702
+
2703
+ /* Clickable */
2704
+ .vyre-tag--clickable {
2705
+ cursor: pointer;
2706
+ transition: background var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out),
2707
+ border-color var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
2708
+ }
2709
+
2710
+ .vyre-tag--clickable:hover {
2711
+ border-color: var(--vyre-color-semantic-accent);
2712
+ }
2713
+
2714
+ .vyre-tag--clickable:focus-visible {
2715
+ outline: 2px solid var(--vyre-color-semantic-accent);
2716
+ outline-offset: 1px;
2717
+ }
2718
+
2719
+ .vyre-tag--disabled {
2720
+ opacity: 0.5;
2721
+ cursor: not-allowed;
2722
+ pointer-events: none;
2723
+ }
2724
+
2725
+ /* Tag group container */
2726
+ .vyre-tag-group {
2727
+ display: flex;
2728
+ flex-wrap: wrap;
2729
+ align-items: center;
2730
+ }
2731
+
2732
+ .vyre-tag-group--nowrap {
2733
+ flex-wrap: nowrap;
2734
+ overflow-x: auto;
2735
+ }
2736
+
2737
+ .vyre-tag-group--gap-sm { gap: var(--vyre-spacing-1); }
2738
+ .vyre-tag-group--gap-md { gap: var(--vyre-spacing-2); }
2739
+ .vyre-tag-group--gap-lg { gap: var(--vyre-spacing-3); }
2740
+
2741
+ /* Inline text field */
2742
+ .vyre-tags-input__field {
2743
+ flex: 1;
2744
+ min-width: 6rem;
2745
+ border: none;
2746
+ background: transparent;
2747
+ outline: none;
2748
+ font-family: var(--vyre-typography-font-family-body);
2749
+ font-size: var(--vyre-typography-font-size-sm);
2750
+ color: var(--vyre-color-semantic-text-primary);
2751
+ padding: 0;
2752
+ line-height: 1.5;
2753
+ }
2754
+
2755
+ .vyre-tags-input__field::placeholder {
2756
+ color: var(--vyre-color-semantic-text-muted);
2757
+ }
2758
+
2759
+ .vyre-tags-input__field:disabled {
2760
+ cursor: not-allowed;
2761
+ }
2762
+
2763
+ /* ── COMBOBOX ────────────────────────────────────────────────── */
2764
+ @keyframes vyre-combobox-in {
2765
+ from { opacity: 0; transform: translateY(-4px); }
2766
+ to { opacity: 1; transform: translateY(0); }
2767
+ }
2768
+
2769
+ .vyre-combobox {
2770
+ position: relative;
2771
+ display: inline-flex;
2772
+ flex-direction: column;
2773
+ width: 100%;
2774
+ }
2775
+
2776
+ .vyre-combobox__input {
2777
+ width: 100%;
2778
+ padding: var(--vyre-spacing-3) var(--vyre-spacing-8) var(--vyre-spacing-3) var(--vyre-spacing-3);
2779
+ background: var(--vyre-color-semantic-surface);
2780
+ border: 1px solid var(--vyre-color-semantic-border);
2781
+ border-radius: var(--vyre-border-radius-md);
2782
+ font-family: var(--vyre-typography-font-family-body);
2783
+ font-size: var(--vyre-typography-font-size-sm);
2784
+ color: var(--vyre-color-semantic-text-primary);
2785
+ transition: border-color var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out),
2786
+ box-shadow var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
2787
+ cursor: pointer;
2788
+ outline: none;
2789
+ }
2790
+
2791
+ .vyre-combobox__input::placeholder {
2792
+ color: var(--vyre-color-semantic-text-muted);
2793
+ }
2794
+
2795
+ .vyre-combobox__input:focus {
2796
+ border-color: var(--vyre-color-semantic-accent);
2797
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--vyre-color-semantic-accent) 15%, transparent);
2798
+ cursor: text;
2799
+ }
2800
+
2801
+ .vyre-combobox__input:disabled,
2802
+ .vyre-combobox--disabled .vyre-combobox__input {
2803
+ opacity: 0.5;
2804
+ cursor: not-allowed;
2805
+ }
2806
+
2807
+ /* Chevron icon overlay */
2808
+ .vyre-combobox__chevron {
2809
+ position: absolute;
2810
+ right: var(--vyre-spacing-3);
2811
+ top: 50%;
2812
+ transform: translateY(-50%);
2813
+ display: flex;
2814
+ align-items: center;
2815
+ color: var(--vyre-color-semantic-text-muted);
2816
+ pointer-events: none;
2817
+ }
2818
+
2819
+ .vyre-combobox[data-open="true"] .vyre-combobox__chevron {
2820
+ transform: translateY(-50%) rotate(180deg);
2821
+ }
2822
+
2823
+ /* Dropdown */
2824
+ .vyre-combobox__dropdown {
2825
+ position: absolute;
2826
+ top: calc(100% + var(--vyre-spacing-1));
2827
+ left: 0;
2828
+ right: 0;
2829
+ z-index: 50;
2830
+ max-height: 16rem;
2831
+ overflow-y: auto;
2832
+ background: var(--vyre-color-semantic-surface);
2833
+ border: 1px solid var(--vyre-color-semantic-border);
2834
+ border-radius: var(--vyre-border-radius-lg);
2835
+ box-shadow: 0 8px 24px -4px rgb(0 0 0 / 0.14), 0 2px 8px -2px rgb(0 0 0 / 0.08);
2836
+ padding: var(--vyre-spacing-1);
2837
+ margin: 0;
2838
+ list-style: none;
2839
+ animation: vyre-combobox-in var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
2840
+ }
2841
+
2842
+ .vyre-combobox__option {
2843
+ padding: var(--vyre-spacing-2) var(--vyre-spacing-3);
2844
+ border-radius: var(--vyre-border-radius-sm);
2845
+ font-size: var(--vyre-typography-font-size-sm);
2846
+ color: var(--vyre-color-semantic-text-primary);
2847
+ cursor: pointer;
2848
+ user-select: none;
2849
+ transition: background var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
2850
+ }
2851
+
2852
+ .vyre-combobox__option--highlighted,
2853
+ .vyre-combobox__option:hover {
2854
+ background: var(--vyre-color-semantic-surface-raised);
2855
+ color: var(--vyre-color-semantic-text-primary);
2856
+ }
2857
+
2858
+ .vyre-combobox__option--selected {
2859
+ background: var(--vyre-color-semantic-accent-subtle);
2860
+ color: var(--vyre-color-semantic-accent);
2861
+ font-weight: var(--vyre-typography-font-weight-medium);
2862
+ }
2863
+
2864
+ .vyre-combobox__option--highlighted.vyre-combobox__option--selected {
2865
+ background: var(--vyre-color-semantic-accent-subtle);
2866
+ filter: brightness(0.95);
2867
+ }
2868
+
2869
+ .vyre-combobox__option[aria-disabled="true"] {
2870
+ opacity: 0.4;
2871
+ cursor: not-allowed;
2872
+ pointer-events: none;
2873
+ }
2874
+
2875
+ .vyre-combobox__empty {
2876
+ padding: var(--vyre-spacing-3) var(--vyre-spacing-3);
2877
+ font-size: var(--vyre-typography-font-size-sm);
2878
+ color: var(--vyre-color-semantic-text-muted);
2879
+ text-align: center;
2880
+ list-style: none;
2881
+ }
2882
+
2883
+ /* Size variants */
2884
+ .vyre-combobox--sm .vyre-combobox__input {
2885
+ padding: var(--vyre-spacing-2) var(--vyre-spacing-8) var(--vyre-spacing-2) var(--vyre-spacing-3);
2886
+ font-size: var(--vyre-typography-font-size-xs);
2887
+ border-radius: var(--vyre-border-radius-sm);
2888
+ }
2889
+
2890
+ .vyre-combobox--lg .vyre-combobox__input {
2891
+ padding: var(--vyre-spacing-4) var(--vyre-spacing-8) var(--vyre-spacing-4) var(--vyre-spacing-5);
2892
+ font-size: var(--vyre-typography-font-size-md);
2893
+ border-radius: var(--vyre-border-radius-lg);
2894
+ }
2895
+
2896
+ /* ── DATA GRID ───────────────────────────────────────────────── */
2897
+ .vyre-data-grid {
2898
+ width: 100%;
2899
+ overflow: auto;
2900
+ border: 1px solid var(--vyre-color-semantic-border-subtle);
2901
+ border-radius: var(--vyre-border-radius-lg);
2902
+ background: var(--vyre-color-semantic-surface);
2903
+ }
2904
+
2905
+ .vyre-data-grid__table {
2906
+ width: 100%;
2907
+ border-collapse: collapse;
2908
+ font-family: var(--vyre-typography-font-family-body);
2909
+ font-size: var(--vyre-typography-font-size-sm);
2910
+ }
2911
+
2912
+ /* Header */
2913
+ .vyre-data-grid__thead {
2914
+ background: var(--vyre-color-semantic-surface-raised);
2915
+ border-bottom: 1px solid var(--vyre-color-semantic-border-subtle);
2916
+ }
2917
+
2918
+ .vyre-data-grid--sticky-header .vyre-data-grid__thead {
2919
+ position: sticky;
2920
+ top: 0;
2921
+ z-index: 10;
2922
+ }
2923
+
2924
+ .vyre-data-grid__th {
2925
+ padding: var(--vyre-spacing-3) var(--vyre-spacing-4);
2926
+ text-align: left;
2927
+ font-size: var(--vyre-typography-font-size-xs);
2928
+ font-weight: var(--vyre-typography-font-weight-medium);
2929
+ color: var(--vyre-color-semantic-text-muted);
2930
+ letter-spacing: 0.04em;
2931
+ text-transform: uppercase;
2932
+ white-space: nowrap;
2933
+ border-bottom: 1px solid var(--vyre-color-semantic-border-subtle);
2934
+ }
2935
+
2936
+ .vyre-data-grid__th--sortable {
2937
+ padding: 0;
2938
+ }
2939
+
2940
+ .vyre-data-grid__sort-btn {
2941
+ display: inline-flex;
2942
+ align-items: center;
2943
+ gap: var(--vyre-spacing-1);
2944
+ width: 100%;
2945
+ padding: var(--vyre-spacing-3) var(--vyre-spacing-4);
2946
+ border: none;
2947
+ background: none;
2948
+ font-family: inherit;
2949
+ font-size: inherit;
2950
+ font-weight: inherit;
2951
+ color: var(--vyre-color-semantic-text-muted);
2952
+ letter-spacing: inherit;
2953
+ text-transform: inherit;
2954
+ cursor: pointer;
2955
+ text-align: left;
2956
+ transition: color var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
2957
+ }
2958
+
2959
+ .vyre-data-grid__sort-btn:hover {
2960
+ color: var(--vyre-color-semantic-text-primary);
2961
+ }
2962
+
2963
+ .vyre-data-grid__sort-btn:focus-visible {
2964
+ outline: 2px solid var(--vyre-color-semantic-accent);
2965
+ outline-offset: -2px;
2966
+ border-radius: var(--vyre-border-radius-sm);
2967
+ }
2968
+
2969
+ .vyre-data-grid__sort-icon {
2970
+ display: inline-flex;
2971
+ align-items: center;
2972
+ flex-shrink: 0;
2973
+ }
2974
+
2975
+ .vyre-data-grid__th--sort-asc .vyre-data-grid__sort-btn,
2976
+ .vyre-data-grid__th--sort-desc .vyre-data-grid__sort-btn {
2977
+ color: var(--vyre-color-semantic-accent);
2978
+ }
2979
+
2980
+ /* Body */
2981
+ .vyre-data-grid__tbody .vyre-data-grid__row {
2982
+ border-bottom: 1px solid var(--vyre-color-semantic-border-subtle);
2983
+ transition: background var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
2984
+ }
2985
+
2986
+ .vyre-data-grid__tbody .vyre-data-grid__row:last-child {
2987
+ border-bottom: none;
2988
+ }
2989
+
2990
+ .vyre-data-grid__tbody .vyre-data-grid__row:hover:not(.vyre-data-grid__row--skeleton):not(.vyre-data-grid__row--empty) {
2991
+ background: var(--vyre-color-semantic-surface-raised);
2992
+ }
2993
+
2994
+ .vyre-data-grid__td {
2995
+ padding: var(--vyre-spacing-3) var(--vyre-spacing-4);
2996
+ color: var(--vyre-color-semantic-text-primary);
2997
+ vertical-align: middle;
2998
+ }
2999
+
3000
+ /* Empty state */
3001
+ .vyre-data-grid__empty {
3002
+ text-align: center;
3003
+ color: var(--vyre-color-semantic-text-muted);
3004
+ padding: var(--vyre-spacing-10) var(--vyre-spacing-4);
3005
+ }
3006
+
3007
+ /* Skeleton rows */
3008
+ .vyre-data-grid__row--skeleton .vyre-data-grid__td {
3009
+ padding: var(--vyre-spacing-3) var(--vyre-spacing-4);
3010
+ }
3011
+
3012
+ .vyre-data-grid__row--skeleton .vyre-skeleton {
3013
+ width: 100%;
3014
+ max-width: 200px;
3015
+ }
3016
+
3017
+ /* ── ITEM ────────────────────────────────────────────────────── */
3018
+ .vyre-item {
3019
+ display: flex;
3020
+ align-items: center;
3021
+ gap: var(--vyre-spacing-4);
3022
+ width: 100%;
3023
+ background: var(--vyre-color-semantic-surface);
3024
+ border: 1px solid transparent;
3025
+ border-radius: var(--vyre-border-radius-lg);
3026
+ color: var(--vyre-color-semantic-text-primary);
3027
+ text-align: left;
3028
+ transition:
3029
+ background-color var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out),
3030
+ border-color var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
3031
+ }
3032
+
3033
+ /* Sizes */
3034
+ .vyre-item--sm { padding: var(--vyre-spacing-2) var(--vyre-spacing-3); gap: var(--vyre-spacing-3); }
3035
+ .vyre-item--md { padding: var(--vyre-spacing-3) var(--vyre-spacing-4); }
3036
+ .vyre-item--lg { padding: var(--vyre-spacing-4) var(--vyre-spacing-5); }
3037
+
3038
+ /* Variants */
3039
+ .vyre-item--default { /* base styles above */ }
3040
+ .vyre-item--outlined {
3041
+ border-color: var(--vyre-color-semantic-border-subtle);
3042
+ }
3043
+ .vyre-item--muted {
3044
+ background: var(--vyre-color-semantic-surface-raised);
3045
+ }
3046
+ .vyre-item--plain {
3047
+ background: transparent;
3048
+ border-color: transparent;
3049
+ }
3050
+
3051
+ /* Clickable */
3052
+ .vyre-item--clickable { cursor: pointer; }
3053
+ .vyre-item--clickable:hover {
3054
+ background: var(--vyre-color-semantic-surface-raised);
3055
+ }
3056
+ .vyre-item--clickable:focus-visible {
3057
+ outline: 2px solid var(--vyre-color-semantic-accent);
3058
+ outline-offset: -2px;
3059
+ }
3060
+
3061
+ /* Media slot (icon / avatar / thumbnail) */
3062
+ .vyre-item__media {
3063
+ display: flex;
3064
+ align-items: center;
3065
+ justify-content: center;
3066
+ flex-shrink: 0;
3067
+ color: var(--vyre-color-semantic-text-muted);
3068
+ }
3069
+ .vyre-item__media > svg { width: 20px; height: 20px; }
3070
+
3071
+ /* Content column */
3072
+ .vyre-item__content {
3073
+ display: flex;
3074
+ flex-direction: column;
3075
+ gap: var(--vyre-spacing-1);
3076
+ flex: 1 1 auto;
3077
+ min-width: 0;
3078
+ }
3079
+
3080
+ .vyre-item__title {
3081
+ font-size: var(--vyre-typography-font-size-sm);
3082
+ font-weight: var(--vyre-typography-font-weight-medium);
3083
+ line-height: var(--vyre-typography-line-height-snug);
3084
+ color: var(--vyre-color-semantic-text-primary);
3085
+ }
3086
+
3087
+ .vyre-item__description {
3088
+ margin: 0;
3089
+ font-size: var(--vyre-typography-font-size-sm);
3090
+ line-height: var(--vyre-typography-line-height-normal);
3091
+ color: var(--vyre-color-semantic-text-muted);
3092
+ }
3093
+
3094
+ .vyre-item--sm .vyre-item__title,
3095
+ .vyre-item--sm .vyre-item__description { font-size: var(--vyre-typography-font-size-xs); }
3096
+ .vyre-item--lg .vyre-item__title { font-size: var(--vyre-typography-font-size-md); }
3097
+
3098
+ /* Actions slot (pinned right) */
3099
+ .vyre-item__actions {
3100
+ display: flex;
3101
+ align-items: center;
3102
+ gap: var(--vyre-spacing-2);
3103
+ flex-shrink: 0;
3104
+ margin-left: auto;
3105
+ }
3106
+
3107
+ /* Group */
3108
+ .vyre-item-group {
3109
+ display: flex;
3110
+ flex-direction: column;
3111
+ }
3112
+ .vyre-item-group--separated .vyre-item:not(:last-child) {
3113
+ border-bottom: 1px solid var(--vyre-color-semantic-border-subtle);
3114
+ border-radius: 0;
3115
+ }
3116
+ .vyre-item-group--separated .vyre-item:first-child {
3117
+ border-top-left-radius: var(--vyre-border-radius-lg);
3118
+ border-top-right-radius: var(--vyre-border-radius-lg);
3119
+ }
3120
+ .vyre-item-group--separated .vyre-item:last-child {
3121
+ border-bottom-left-radius: var(--vyre-border-radius-lg);
3122
+ border-bottom-right-radius: var(--vyre-border-radius-lg);
3123
+ }
3124
+
3125
+ /* ── DATE RANGE PICKER ───────────────────────────────────────── */
3126
+ .vyre-date-range-picker {
3127
+ display: inline-block;
3128
+ }
3129
+
3130
+ .vyre-date-range-picker__popover {
3131
+ position: absolute;
3132
+ z-index: 1060;
3133
+ display: flex;
3134
+ align-items: stretch;
3135
+ background: var(--vyre-color-semantic-surface);
3136
+ border: 1px solid var(--vyre-color-semantic-border-subtle);
3137
+ border-radius: var(--vyre-border-radius-lg);
3138
+ box-shadow: var(--vyre-shadow-lg);
3139
+ overflow: hidden;
3140
+ animation: vyre-fade-in 120ms ease;
3141
+ }
3142
+
3143
+ .vyre-date-range-picker__presets {
3144
+ display: flex;
3145
+ flex-direction: column;
3146
+ gap: var(--vyre-spacing-1);
3147
+ padding: var(--vyre-spacing-3);
3148
+ border-right: 1px solid var(--vyre-color-semantic-border-subtle);
3149
+ min-width: 140px;
3150
+ }
3151
+
3152
+ .vyre-date-range-picker__preset {
3153
+ display: block;
3154
+ width: 100%;
3155
+ text-align: left;
3156
+ padding: var(--vyre-spacing-2) var(--vyre-spacing-3);
3157
+ background: none;
3158
+ border: none;
3159
+ border-radius: var(--vyre-border-radius-md);
3160
+ color: var(--vyre-color-semantic-text-secondary);
3161
+ font-size: var(--vyre-typography-font-size-sm);
3162
+ cursor: pointer;
3163
+ transition:
3164
+ background-color var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out),
3165
+ color var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
3166
+ }
3167
+ .vyre-date-range-picker__preset:hover {
3168
+ background: var(--vyre-color-semantic-surface-raised);
3169
+ color: var(--vyre-color-semantic-text-primary);
3170
+ }
3171
+ .vyre-date-range-picker__preset:focus-visible {
3172
+ outline: 2px solid var(--vyre-color-semantic-accent);
3173
+ outline-offset: -2px;
3174
+ }
3175
+
3176
+ .vyre-date-range-picker__calendars {
3177
+ display: flex;
3178
+ gap: var(--vyre-spacing-4);
3179
+ padding: var(--vyre-spacing-4);
3180
+ }
3181
+
3182
+ @media (max-width: 640px) {
3183
+ .vyre-date-range-picker__popover {
3184
+ flex-direction: column;
3185
+ }
3186
+ .vyre-date-range-picker__presets {
3187
+ flex-direction: row;
3188
+ flex-wrap: wrap;
3189
+ border-right: none;
3190
+ border-bottom: 1px solid var(--vyre-color-semantic-border-subtle);
3191
+ min-width: 0;
3192
+ }
3193
+ .vyre-date-range-picker__calendars {
3194
+ flex-direction: column;
3195
+ }
3196
+ }
3197
+
3198
+ /* ── KANBAN ──────────────────────────────────────────────────── */
3199
+ .vyre-kanban {
3200
+ display: flex;
3201
+ gap: var(--vyre-spacing-2);
3202
+ align-items: flex-start;
3203
+ overflow-x: auto;
3204
+ padding-bottom: var(--vyre-spacing-2);
3205
+ }
3206
+
3207
+ .vyre-kanban__column {
3208
+ display: flex;
3209
+ flex-direction: column;
3210
+ flex: 0 0 280px;
3211
+ max-height: 100%;
3212
+ background: var(--vyre-color-semantic-surface-raised);
3213
+ border: 1px solid var(--vyre-color-semantic-border-subtle);
3214
+ border-radius: var(--vyre-border-radius-lg);
3215
+ padding: var(--vyre-spacing-3);
3216
+ transition:
3217
+ border-color var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out),
3218
+ background-color var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
3219
+ }
3220
+ .vyre-kanban__column--over {
3221
+ border-color: var(--vyre-color-semantic-accent);
3222
+ background: var(--vyre-color-semantic-accent-subtle);
3223
+ }
3224
+
3225
+ .vyre-kanban__column-header {
3226
+ display: flex;
3227
+ align-items: center;
3228
+ justify-content: space-between;
3229
+ gap: var(--vyre-spacing-2);
3230
+ padding: var(--vyre-spacing-1) var(--vyre-spacing-2) var(--vyre-spacing-3);
3231
+ }
3232
+ .vyre-kanban__column-title {
3233
+ font-size: var(--vyre-typography-font-size-sm);
3234
+ font-weight: var(--vyre-typography-font-weight-semibold);
3235
+ color: var(--vyre-color-semantic-text-primary);
3236
+ }
3237
+ .vyre-kanban__column-count {
3238
+ display: inline-flex;
3239
+ align-items: center;
3240
+ justify-content: center;
3241
+ min-width: 20px;
3242
+ height: 20px;
3243
+ padding: 0 var(--vyre-spacing-2);
3244
+ font-size: var(--vyre-typography-font-size-xs);
3245
+ font-weight: var(--vyre-typography-font-weight-medium);
3246
+ color: var(--vyre-color-semantic-text-muted);
3247
+ background: var(--vyre-color-semantic-surface);
3248
+ border: 1px solid var(--vyre-color-semantic-border-subtle);
3249
+ border-radius: var(--vyre-border-radius-full);
3250
+ }
3251
+
3252
+ .vyre-kanban__cards {
3253
+ display: flex;
3254
+ flex-direction: column;
3255
+ gap: var(--vyre-spacing-2);
3256
+ min-height: var(--vyre-spacing-12);
3257
+ overflow-y: auto;
3258
+ }
3259
+
3260
+ /* Card is the visual shell (.vyre-card); these rules only add the
3261
+ drag affordances on top of it. */
3262
+ .vyre-kanban__card {
3263
+ cursor: grab;
3264
+ transition:
3265
+ opacity var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out),
3266
+ box-shadow var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out),
3267
+ border-color var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
3268
+ }
3269
+ .vyre-kanban__card:hover {
3270
+ border-color: var(--vyre-color-semantic-border);
3271
+ box-shadow: var(--vyre-shadow-sm);
3272
+ }
3273
+ .vyre-kanban__card--dragging {
3274
+ opacity: 0.5;
3275
+ cursor: grabbing;
3276
+ }
3277
+ .vyre-kanban__card--clickable {
3278
+ cursor: pointer;
3279
+ }
3280
+ .vyre-kanban__card--clickable:active {
3281
+ cursor: grabbing;
3282
+ }
3283
+ .vyre-kanban__card--clickable:focus-visible {
3284
+ outline: 2px solid var(--vyre-color-semantic-accent);
3285
+ outline-offset: 2px;
3286
+ }
3287
+ .vyre-kanban__card .vyre-card__body {
3288
+ padding: var(--vyre-spacing-3);
3289
+ }
3290
+
3291
+ .vyre-kanban__card-title {
3292
+ font-size: var(--vyre-typography-font-size-sm);
3293
+ font-weight: var(--vyre-typography-font-weight-medium);
3294
+ line-height: var(--vyre-typography-line-height-snug);
3295
+ color: var(--vyre-color-semantic-text-primary);
3296
+ }
3297
+ .vyre-kanban__card-desc {
3298
+ margin-top: var(--vyre-spacing-1);
3299
+ font-size: var(--vyre-typography-font-size-xs);
3300
+ line-height: var(--vyre-typography-line-height-normal);
3301
+ color: var(--vyre-color-semantic-text-muted);
3302
+ }
3303
+
3304
+ .vyre-kanban__empty {
3305
+ display: flex;
3306
+ align-items: center;
3307
+ justify-content: center;
3308
+ padding: var(--vyre-spacing-6) var(--vyre-spacing-3);
3309
+ font-size: var(--vyre-typography-font-size-xs);
3310
+ color: var(--vyre-color-semantic-text-muted);
3311
+ border: 1px dashed var(--vyre-color-semantic-border-subtle);
3312
+ border-radius: var(--vyre-border-radius-md);
3313
+ }
3314
+
3315
+ /* Column tints (data-color) */
3316
+ .vyre-kanban__column[data-color="accent"] { background: var(--vyre-color-semantic-accent-subtle); border-color: var(--vyre-color-semantic-accent-subtle-border); }
3317
+ .vyre-kanban__column[data-color="teal"] { background: var(--vyre-color-semantic-teal-subtle); }
3318
+ .vyre-kanban__column[data-color="success"] { background: var(--vyre-color-semantic-success-subtle); border-color: var(--vyre-color-semantic-success-subtle-border); }
3319
+ .vyre-kanban__column[data-color="warning"] { background: var(--vyre-color-semantic-warning-subtle); border-color: var(--vyre-color-semantic-warning-subtle-border); }
3320
+ .vyre-kanban__column[data-color="danger"] { background: var(--vyre-color-semantic-danger-subtle); border-color: var(--vyre-color-semantic-danger-subtle-border); }
3321
+
3322
+ /* Card tints (data-color) — applied to the wrapping .vyre-card */
3323
+ .vyre-kanban__card[data-color="accent"] { background: var(--vyre-color-semantic-accent-subtle); border-color: var(--vyre-color-semantic-accent-subtle-border); }
3324
+ .vyre-kanban__card[data-color="teal"] { background: var(--vyre-color-semantic-teal-subtle); }
3325
+ .vyre-kanban__card[data-color="success"] { background: var(--vyre-color-semantic-success-subtle); border-color: var(--vyre-color-semantic-success-subtle-border); }
3326
+ .vyre-kanban__card[data-color="warning"] { background: var(--vyre-color-semantic-warning-subtle); border-color: var(--vyre-color-semantic-warning-subtle-border); }
3327
+ .vyre-kanban__card[data-color="danger"] { background: var(--vyre-color-semantic-danger-subtle); border-color: var(--vyre-color-semantic-danger-subtle-border); }
3328
+
3329
+ /* Drop placeholder shown at the target position while dragging */
3330
+ .vyre-kanban__placeholder {
3331
+ height: var(--vyre-spacing-10);
3332
+ border: 2px dashed var(--vyre-color-semantic-accent);
3333
+ border-radius: var(--vyre-border-radius-md);
3334
+ background: var(--vyre-color-semantic-accent-subtle);
3335
+ opacity: 0.7;
3336
+ }
3337
+
3338
+ /* ── CONVERSATION ────────────────────────────────────────────── */
3339
+ .vyre-conversation {
3340
+ display: flex;
3341
+ flex-direction: column;
3342
+ min-height: 0;
3343
+ background: var(--vyre-color-semantic-surface);
3344
+ border: 1px solid var(--vyre-color-semantic-border-subtle);
3345
+ border-radius: var(--vyre-border-radius-lg);
3346
+ overflow: hidden;
3347
+ }
3348
+
3349
+ .vyre-conversation__thread {
3350
+ display: flex;
3351
+ flex-direction: column;
3352
+ gap: var(--vyre-spacing-1);
3353
+ padding: var(--vyre-spacing-4);
3354
+ overflow-y: auto;
3355
+ flex: 1 1 auto;
3356
+ }
3357
+
3358
+ .vyre-conversation__day {
3359
+ display: flex;
3360
+ align-items: center;
3361
+ justify-content: center;
3362
+ margin: var(--vyre-spacing-3) 0;
3363
+ }
3364
+ .vyre-conversation__day span {
3365
+ font-size: var(--vyre-typography-font-size-xs);
3366
+ color: var(--vyre-color-semantic-text-muted);
3367
+ background: var(--vyre-color-semantic-surface-raised);
3368
+ border: 1px solid var(--vyre-color-semantic-border-subtle);
3369
+ padding: var(--vyre-spacing-1) var(--vyre-spacing-3);
3370
+ border-radius: var(--vyre-border-radius-full);
3371
+ }
3372
+
3373
+ .vyre-conversation__row {
3374
+ display: flex;
3375
+ align-items: flex-end;
3376
+ gap: var(--vyre-spacing-2);
3377
+ width: 100%;
3378
+ }
3379
+ .vyre-conversation__row--in { justify-content: flex-start; }
3380
+ .vyre-conversation__row--out { justify-content: flex-end; }
3381
+ .vyre-conversation__row--out .vyre-conversation__avatar { display: none; }
3382
+ .vyre-conversation__row--group-end { margin-bottom: var(--vyre-spacing-3); }
3383
+
3384
+ .vyre-conversation__avatar {
3385
+ width: 28px;
3386
+ flex-shrink: 0;
3387
+ }
3388
+
3389
+ .vyre-conversation__stack {
3390
+ display: flex;
3391
+ flex-direction: column;
3392
+ gap: var(--vyre-spacing-1);
3393
+ min-width: 0;
3394
+ max-width: 75%;
3395
+ }
3396
+ .vyre-conversation__row--out .vyre-conversation__stack { align-items: flex-end; }
3397
+
3398
+ .vyre-conversation__author {
3399
+ font-size: var(--vyre-typography-font-size-xs);
3400
+ font-weight: var(--vyre-typography-font-weight-medium);
3401
+ color: var(--vyre-color-semantic-text-secondary);
3402
+ padding: 0 var(--vyre-spacing-1);
3403
+ }
3404
+
3405
+ .vyre-conversation__bubble {
3406
+ padding: var(--vyre-spacing-2) var(--vyre-spacing-3);
3407
+ border-radius: var(--vyre-border-radius-lg);
3408
+ font-size: var(--vyre-typography-font-size-sm);
3409
+ line-height: var(--vyre-typography-line-height-normal);
3410
+ word-break: break-word;
3411
+ white-space: pre-wrap;
3412
+ }
3413
+ .vyre-conversation__row--in .vyre-conversation__bubble {
3414
+ background: var(--vyre-color-semantic-surface-raised);
3415
+ color: var(--vyre-color-semantic-text-primary);
3416
+ border-bottom-left-radius: var(--vyre-border-radius-sm);
3417
+ }
3418
+ .vyre-conversation__row--out .vyre-conversation__bubble {
3419
+ background: var(--vyre-color-semantic-accent);
3420
+ color: var(--vyre-color-semantic-accent-foreground);
3421
+ border-bottom-right-radius: var(--vyre-border-radius-sm);
3422
+ }
3423
+
3424
+ /* Attachments inside a bubble */
3425
+ .vyre-conversation__attachments {
3426
+ display: flex;
3427
+ flex-direction: column;
3428
+ gap: var(--vyre-spacing-2);
3429
+ }
3430
+ .vyre-conversation__attachments:not(:last-child) {
3431
+ margin-bottom: var(--vyre-spacing-2);
3432
+ }
3433
+ .vyre-conversation__att {
3434
+ display: block;
3435
+ max-width: 240px;
3436
+ }
3437
+ .vyre-conversation__att--image img {
3438
+ display: block;
3439
+ width: 100%;
3440
+ max-height: 220px;
3441
+ object-fit: cover;
3442
+ border-radius: var(--vyre-border-radius-md);
3443
+ }
3444
+ .vyre-conversation__att--audio,
3445
+ .vyre-conversation__att--video {
3446
+ width: 240px;
3447
+ max-width: 100%;
3448
+ }
3449
+ .vyre-conversation__att--video {
3450
+ border-radius: var(--vyre-border-radius-md);
3451
+ overflow: hidden;
3452
+ }
3453
+ .vyre-conversation__att--file {
3454
+ display: flex;
3455
+ align-items: center;
3456
+ gap: var(--vyre-spacing-2);
3457
+ padding: var(--vyre-spacing-2) var(--vyre-spacing-3);
3458
+ background: var(--vyre-color-semantic-surface);
3459
+ border: 1px solid var(--vyre-color-semantic-border-subtle);
3460
+ border-radius: var(--vyre-border-radius-md);
3461
+ text-decoration: none;
3462
+ color: inherit;
3463
+ transition: border-color var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
3464
+ }
3465
+ .vyre-conversation__att--file:hover {
3466
+ border-color: var(--vyre-color-semantic-border);
3467
+ }
3468
+ .vyre-conversation__att-icon {
3469
+ display: flex;
3470
+ flex-shrink: 0;
3471
+ color: var(--vyre-color-semantic-text-muted);
3472
+ }
3473
+ .vyre-conversation__att-info {
3474
+ display: flex;
3475
+ flex-direction: column;
3476
+ min-width: 0;
3477
+ }
3478
+ .vyre-conversation__att-name {
3479
+ font-size: var(--vyre-typography-font-size-sm);
3480
+ font-weight: var(--vyre-typography-font-weight-medium);
3481
+ color: var(--vyre-color-semantic-text-primary);
3482
+ overflow: hidden;
3483
+ text-overflow: ellipsis;
3484
+ white-space: nowrap;
3485
+ }
3486
+ .vyre-conversation__att-size {
3487
+ font-size: var(--vyre-typography-font-size-xs);
3488
+ color: var(--vyre-color-semantic-text-muted);
3489
+ }
3490
+
3491
+ .vyre-conversation__meta {
3492
+ font-size: var(--vyre-typography-font-size-2xs);
3493
+ color: var(--vyre-color-semantic-text-muted);
3494
+ padding: 0 var(--vyre-spacing-1);
3495
+ }
3496
+ .vyre-conversation__status--read { color: var(--vyre-color-semantic-accent); }
3497
+
3498
+ .vyre-conversation__bubble--typing {
3499
+ display: inline-flex;
3500
+ align-items: center;
3501
+ gap: var(--vyre-spacing-1);
3502
+ }
3503
+ .vyre-conversation__dot {
3504
+ width: 6px;
3505
+ height: 6px;
3506
+ border-radius: var(--vyre-border-radius-full);
3507
+ background: var(--vyre-color-semantic-text-muted);
3508
+ animation: vyre-conversation-typing 1.2s infinite ease-in-out;
3509
+ }
3510
+ .vyre-conversation__dot:nth-child(2) { animation-delay: 0.15s; }
3511
+ .vyre-conversation__dot:nth-child(3) { animation-delay: 0.3s; }
3512
+ .vyre-conversation__typing-label {
3513
+ font-size: var(--vyre-typography-font-size-xs);
3514
+ color: var(--vyre-color-semantic-text-muted);
3515
+ margin-left: var(--vyre-spacing-1);
3516
+ }
3517
+ @keyframes vyre-conversation-typing {
3518
+ 0%, 60%, 100% { opacity: 0.3; transform: translateY(0); }
3519
+ 30% { opacity: 1; transform: translateY(-2px); }
3520
+ }
3521
+
3522
+ .vyre-conversation__composer {
3523
+ display: flex;
3524
+ flex-direction: column;
3525
+ gap: var(--vyre-spacing-2);
3526
+ padding: var(--vyre-spacing-3);
3527
+ border-top: 1px solid var(--vyre-color-semantic-border-subtle);
3528
+ background: var(--vyre-color-semantic-surface);
3529
+ }
3530
+ .vyre-conversation__composer-row {
3531
+ display: flex;
3532
+ align-items: center;
3533
+ gap: var(--vyre-spacing-2);
3534
+ }
3535
+ .vyre-conversation__file-input {
3536
+ display: none;
3537
+ }
3538
+ .vyre-conversation__attach {
3539
+ display: flex;
3540
+ align-items: center;
3541
+ justify-content: center;
3542
+ width: 36px;
3543
+ height: 36px;
3544
+ flex-shrink: 0;
3545
+ color: var(--vyre-color-semantic-text-muted);
3546
+ background: transparent;
3547
+ border: none;
3548
+ border-radius: var(--vyre-border-radius-full);
3549
+ cursor: pointer;
3550
+ transition:
3551
+ color var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out),
3552
+ background-color var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
3553
+ }
3554
+ .vyre-conversation__attach:hover {
3555
+ color: var(--vyre-color-semantic-text-primary);
3556
+ background: var(--vyre-color-semantic-surface-raised);
3557
+ }
3558
+ .vyre-conversation__attach:focus-visible {
3559
+ outline: 2px solid var(--vyre-color-semantic-accent);
3560
+ outline-offset: 2px;
3561
+ }
3562
+ .vyre-conversation__staged {
3563
+ display: flex;
3564
+ flex-wrap: wrap;
3565
+ gap: var(--vyre-spacing-2);
3566
+ }
3567
+ .vyre-conversation__chip {
3568
+ display: inline-flex;
3569
+ align-items: center;
3570
+ gap: var(--vyre-spacing-1);
3571
+ max-width: 200px;
3572
+ padding: var(--vyre-spacing-1) var(--vyre-spacing-2);
3573
+ font-size: var(--vyre-typography-font-size-xs);
3574
+ color: var(--vyre-color-semantic-text-secondary);
3575
+ background: var(--vyre-color-semantic-surface-raised);
3576
+ border: 1px solid var(--vyre-color-semantic-border-subtle);
3577
+ border-radius: var(--vyre-border-radius-full);
3578
+ }
3579
+ .vyre-conversation__chip-name {
3580
+ overflow: hidden;
3581
+ text-overflow: ellipsis;
3582
+ white-space: nowrap;
3583
+ }
3584
+ .vyre-conversation__chip-remove {
3585
+ display: flex;
3586
+ align-items: center;
3587
+ justify-content: center;
3588
+ flex-shrink: 0;
3589
+ padding: 2px;
3590
+ color: var(--vyre-color-semantic-text-muted);
3591
+ background: transparent;
3592
+ border: none;
3593
+ border-radius: var(--vyre-border-radius-full);
3594
+ cursor: pointer;
3595
+ }
3596
+ .vyre-conversation__chip-remove:hover {
3597
+ color: var(--vyre-color-semantic-danger);
3598
+ }
3599
+ .vyre-conversation__input {
3600
+ flex: 1 1 auto;
3601
+ min-width: 0;
3602
+ padding: var(--vyre-spacing-2) var(--vyre-spacing-3);
3603
+ font-size: var(--vyre-typography-font-size-sm);
3604
+ color: var(--vyre-color-semantic-text-primary);
3605
+ background: var(--vyre-color-semantic-surface-raised);
3606
+ border: 1px solid var(--vyre-color-semantic-border-subtle);
3607
+ border-radius: var(--vyre-border-radius-full);
3608
+ outline: none;
3609
+ transition: border-color var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
3610
+ }
3611
+ .vyre-conversation__input:focus-visible {
3612
+ border-color: var(--vyre-color-semantic-accent);
3613
+ }
3614
+ .vyre-conversation__input::placeholder {
3615
+ color: var(--vyre-color-semantic-text-muted);
3616
+ }
3617
+ .vyre-conversation__send {
3618
+ display: flex;
3619
+ align-items: center;
3620
+ justify-content: center;
3621
+ width: 36px;
3622
+ height: 36px;
3623
+ flex-shrink: 0;
3624
+ color: var(--vyre-color-semantic-accent-foreground);
3625
+ background: var(--vyre-color-semantic-accent);
3626
+ border: none;
3627
+ border-radius: var(--vyre-border-radius-full);
3628
+ cursor: pointer;
3629
+ transition: background-color var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
3630
+ }
3631
+ .vyre-conversation__send:hover:not(:disabled) {
3632
+ background: var(--vyre-color-semantic-accent-hover);
3633
+ }
3634
+ .vyre-conversation__send:disabled {
3635
+ opacity: 0.5;
3636
+ cursor: not-allowed;
3637
+ }
3638
+ .vyre-conversation__send:focus-visible {
3639
+ outline: 2px solid var(--vyre-color-semantic-accent);
3640
+ outline-offset: 2px;
3641
+ }
3642
+
3643
+ /* ── RADIO ───────────────────────────────────────────────────── */
3644
+ .vyre-radio-group {
3645
+ display: flex;
3646
+ gap: var(--vyre-spacing-3);
3647
+ }
3648
+ .vyre-radio-group--vertical { flex-direction: column; }
3649
+ .vyre-radio-group--horizontal { flex-direction: row; flex-wrap: wrap; }
3650
+
3651
+ .vyre-radio {
3652
+ display: inline-flex;
3653
+ align-items: flex-start;
3654
+ gap: var(--vyre-spacing-2);
3655
+ cursor: pointer;
3656
+ }
3657
+ .vyre-radio--disabled {
3658
+ cursor: not-allowed;
3659
+ opacity: 0.55;
3660
+ }
3661
+
3662
+ .vyre-radio__input {
3663
+ position: absolute;
3664
+ opacity: 0;
3665
+ width: 1px;
3666
+ height: 1px;
3667
+ margin: 0;
3668
+ pointer-events: none;
3669
+ }
3670
+
3671
+ .vyre-radio__control {
3672
+ flex-shrink: 0;
3673
+ display: flex;
3674
+ align-items: center;
3675
+ justify-content: center;
3676
+ border: 1.5px solid var(--vyre-color-semantic-border-strong);
3677
+ border-radius: var(--vyre-border-radius-full);
3678
+ background: var(--vyre-color-semantic-background);
3679
+ transition:
3680
+ border-color var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out),
3681
+ background var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
3682
+ }
3683
+ .vyre-radio--sm .vyre-radio__control { width: 1rem; height: 1rem; }
3684
+ .vyre-radio--md .vyre-radio__control { width: 1.125rem; height: 1.125rem; }
3685
+
3686
+ .vyre-radio__dot {
3687
+ width: 40%;
3688
+ height: 40%;
3689
+ border-radius: var(--vyre-border-radius-full);
3690
+ background: var(--vyre-color-semantic-accent-foreground);
3691
+ transform: scale(0);
3692
+ transition: transform var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
3693
+ }
3694
+ .vyre-radio__input:checked ~ .vyre-radio__control {
3695
+ border-color: var(--vyre-color-semantic-accent);
3696
+ background: var(--vyre-color-semantic-accent);
3697
+ }
3698
+ .vyre-radio__input:checked ~ .vyre-radio__control .vyre-radio__dot {
3699
+ transform: scale(1);
3700
+ }
3701
+ .vyre-radio__input:focus-visible ~ .vyre-radio__control {
3702
+ outline: 2px solid var(--vyre-color-semantic-accent);
3703
+ outline-offset: 2px;
3704
+ }
3705
+
3706
+ .vyre-radio__content {
3707
+ display: flex;
3708
+ flex-direction: column;
3709
+ gap: calc(var(--vyre-spacing-1) / 2);
3710
+ line-height: var(--vyre-typography-line-height-snug);
3711
+ }
3712
+ .vyre-radio__label {
3713
+ font-size: var(--vyre-typography-font-size-sm);
3714
+ color: var(--vyre-color-semantic-text-primary);
3715
+ }
3716
+ .vyre-radio__description {
3717
+ font-size: var(--vyre-typography-font-size-xs);
3718
+ color: var(--vyre-color-semantic-text-muted);
3719
+ }
3720
+
3721
+ /* ── FIELD (composable parts) ────────────────────────────────── */
3722
+ .vyre-field__description {
3723
+ margin: 0;
3724
+ font-size: var(--vyre-typography-font-size-xs);
3725
+ color: var(--vyre-color-semantic-text-muted);
3726
+ line-height: var(--vyre-typography-line-height-normal);
3727
+ }
3728
+ .vyre-field__error {
3729
+ margin: 0;
3730
+ font-size: var(--vyre-typography-font-size-xs);
3731
+ color: var(--vyre-color-semantic-danger);
3732
+ line-height: var(--vyre-typography-line-height-normal);
3733
+ }
3734
+
3735
+ .vyre-field-group {
3736
+ display: flex;
3737
+ gap: var(--vyre-spacing-4);
3738
+ }
3739
+ .vyre-field-group--vertical { flex-direction: column; }
3740
+ .vyre-field-group--horizontal { flex-direction: row; flex-wrap: wrap; }
3741
+ .vyre-field-group--horizontal > * { flex: 1 1 0; min-width: 0; }
3742
+
3743
+ .vyre-field-set {
3744
+ display: flex;
3745
+ flex-direction: column;
3746
+ gap: var(--vyre-spacing-3);
3747
+ margin: 0;
3748
+ padding: var(--vyre-spacing-4);
3749
+ border: 1px solid var(--vyre-color-semantic-border-subtle);
3750
+ border-radius: var(--vyre-border-radius-lg);
3751
+ }
3752
+ .vyre-field-set__legend {
3753
+ padding: 0 var(--vyre-spacing-2);
3754
+ font-size: var(--vyre-typography-font-size-sm);
3755
+ font-weight: var(--vyre-typography-font-weight-semibold);
3756
+ color: var(--vyre-color-semantic-text-primary);
3757
+ }
3758
+
3759
+ /* ── RICH TEXT EDITOR ────────────────────────────────────────── */
3760
+ .vyre-rte {
3761
+ display: flex;
3762
+ flex-direction: column;
3763
+ background: var(--vyre-color-semantic-surface);
3764
+ border: 1px solid var(--vyre-color-semantic-border);
3765
+ border-radius: var(--vyre-border-radius-lg);
3766
+ overflow: hidden;
3767
+ }
3768
+ .vyre-rte--disabled { opacity: 0.6; }
3769
+
3770
+ .vyre-rte__toolbar {
3771
+ display: flex;
3772
+ flex-wrap: wrap;
3773
+ gap: var(--vyre-spacing-1);
3774
+ padding: var(--vyre-spacing-2);
3775
+ border-bottom: 1px solid var(--vyre-color-semantic-border-subtle);
3776
+ background: var(--vyre-color-semantic-surface-raised);
3777
+ }
3778
+ .vyre-rte__tool {
3779
+ display: inline-flex;
3780
+ align-items: center;
3781
+ justify-content: center;
3782
+ min-width: 1.75rem;
3783
+ height: 1.75rem;
3784
+ padding: 0 var(--vyre-spacing-2);
3785
+ font-size: var(--vyre-typography-font-size-xs);
3786
+ color: var(--vyre-color-semantic-text-secondary);
3787
+ background: transparent;
3788
+ border: 1px solid transparent;
3789
+ border-radius: var(--vyre-border-radius-sm);
3790
+ cursor: pointer;
3791
+ transition:
3792
+ background var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out),
3793
+ color var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
3794
+ }
3795
+ .vyre-rte__tool:hover:not(:disabled) {
3796
+ background: var(--vyre-color-semantic-surface);
3797
+ color: var(--vyre-color-semantic-text-primary);
3798
+ }
3799
+ .vyre-rte__tool:focus-visible {
3800
+ outline: 2px solid var(--vyre-color-semantic-accent);
3801
+ outline-offset: 1px;
3802
+ }
3803
+ .vyre-rte__tool:disabled { cursor: not-allowed; opacity: 0.5; }
3804
+
3805
+ .vyre-rte__content {
3806
+ padding: var(--vyre-spacing-4);
3807
+ font-size: var(--vyre-typography-font-size-sm);
3808
+ line-height: var(--vyre-typography-line-height-relaxed);
3809
+ color: var(--vyre-color-semantic-text-primary);
3810
+ outline: none;
3811
+ overflow-y: auto;
3812
+ }
3813
+ .vyre-rte__content:empty::before {
3814
+ content: attr(data-placeholder);
3815
+ color: var(--vyre-color-semantic-text-muted);
3816
+ pointer-events: none;
3817
+ }
3818
+ .vyre-rte__content:focus-visible {
3819
+ box-shadow: inset 0 0 0 2px var(--vyre-color-semantic-accent-subtle);
3820
+ }
3821
+ .vyre-rte__content > :first-child { margin-top: 0; }
3822
+ .vyre-rte__content > :last-child { margin-bottom: 0; }
3823
+ .vyre-rte__content h1 {
3824
+ font-size: var(--vyre-typography-font-size-2xl);
3825
+ font-weight: var(--vyre-typography-font-weight-bold);
3826
+ margin: var(--vyre-spacing-4) 0 var(--vyre-spacing-2);
3827
+ }
3828
+ .vyre-rte__content h2 {
3829
+ font-size: var(--vyre-typography-font-size-xl);
3830
+ font-weight: var(--vyre-typography-font-weight-semibold);
3831
+ margin: var(--vyre-spacing-4) 0 var(--vyre-spacing-2);
3832
+ }
3833
+ .vyre-rte__content h3 {
3834
+ font-size: var(--vyre-typography-font-size-lg);
3835
+ font-weight: var(--vyre-typography-font-weight-semibold);
3836
+ margin: var(--vyre-spacing-3) 0 var(--vyre-spacing-2);
3837
+ }
3838
+ .vyre-rte__content p { margin: 0 0 var(--vyre-spacing-2); }
3839
+ .vyre-rte__content ul,
3840
+ .vyre-rte__content ol {
3841
+ margin: 0 0 var(--vyre-spacing-2);
3842
+ padding-left: var(--vyre-spacing-6);
3843
+ }
3844
+ .vyre-rte__content li { margin-bottom: var(--vyre-spacing-1); }
3845
+ .vyre-rte__content a {
3846
+ color: var(--vyre-color-semantic-accent);
3847
+ text-decoration: underline;
3848
+ }
3849
+ .vyre-rte__content blockquote {
3850
+ margin: 0 0 var(--vyre-spacing-2);
3851
+ padding-left: var(--vyre-spacing-4);
3852
+ border-left: 3px solid var(--vyre-color-semantic-border-strong);
3853
+ color: var(--vyre-color-semantic-text-secondary);
3854
+ }
3855
+ .vyre-rte__content pre {
3856
+ margin: 0 0 var(--vyre-spacing-2);
3857
+ padding: var(--vyre-spacing-3);
3858
+ background: var(--vyre-color-semantic-surface-raised);
3859
+ border-radius: var(--vyre-border-radius-md);
3860
+ font-family: var(--vyre-typography-font-family-mono);
3861
+ font-size: var(--vyre-typography-font-size-xs);
3862
+ white-space: pre-wrap;
3863
+ }