@usevyre/react 1.0.2 → 1.1.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.
@@ -1,8 +1,8 @@
1
1
  /* ============================================================
2
- @vyre/react — Component Styles
3
-
4
- REQUIRES: @import "@vyre/tokens/css" before this file.
5
-
2
+ @usevyre/react — Component Styles
3
+
4
+ REQUIRES: @import "@usevyre/tokens/css" before this file.
5
+
6
6
  AI CONTEXT:
7
7
  - All colors reference var(--vyre-color-semantic-*) tokens
8
8
  - All spacing uses var(--vyre-spacing-*) tokens
@@ -2509,3 +2509,507 @@
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
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@usevyre/react",
3
- "version": "1.0.2",
3
+ "version": "1.1.0",
4
4
  "description": "useVyre React components — AI-native, accessible, zero-runtime styling",
5
5
  "keywords": [
6
6
  "design-system",
@@ -16,38 +16,20 @@
16
16
  },
17
17
  "license": "MIT",
18
18
  "type": "module",
19
- "main": "./src/index.ts",
20
- "module": "./src/index.ts",
21
- "types": "./src/index.ts",
19
+ "main": "./dist/index.cjs",
20
+ "module": "./dist/index.js",
21
+ "types": "./dist/index.d.ts",
22
22
  "exports": {
23
23
  ".": {
24
- "import": "./src/index.ts",
25
- "types": "./src/index.ts"
24
+ "import": "./dist/index.js",
25
+ "require": "./dist/index.cjs",
26
+ "types": "./dist/index.d.ts"
26
27
  },
27
- "./styles": "./src/styles/components.css"
28
- },
29
- "publishConfig": {
30
- "main": "./dist/index.cjs",
31
- "module": "./dist/index.js",
32
- "types": "./dist/index.d.ts",
33
- "exports": {
34
- ".": {
35
- "import": "./dist/index.js",
36
- "require": "./dist/index.cjs",
37
- "types": "./dist/index.d.ts"
38
- },
39
- "./styles": "./dist/styles/components.css"
40
- }
28
+ "./styles": "./dist/styles/components.css"
41
29
  },
42
30
  "files": [
43
31
  "dist"
44
32
  ],
45
- "scripts": {
46
- "build": "vite build && tsc --project tsconfig.build.json && mkdir -p dist/styles && cp src/styles/components.css dist/styles/",
47
- "dev": "vite build --watch",
48
- "typecheck": "tsc --noEmit",
49
- "clean": "rm -rf dist"
50
- },
51
33
  "peerDependencies": {
52
34
  "react": ">=18.0.0",
53
35
  "react-dom": ">=18.0.0"
@@ -62,5 +44,11 @@
62
44
  },
63
45
  "dependencies": {
64
46
  "@usevyre/tokens": "^1.0.0"
47
+ },
48
+ "scripts": {
49
+ "build": "vite build && tsc --project tsconfig.build.json && mkdir -p dist/styles && cp src/styles/components.css dist/styles/",
50
+ "dev": "vite build --watch",
51
+ "typecheck": "tsc --noEmit",
52
+ "clean": "rm -rf dist"
65
53
  }
66
- }
54
+ }