@hlw-uni/mp-vue 1.0.34 → 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.
package/dist/style.css CHANGED
@@ -32,7 +32,87 @@
32
32
  }
33
33
  .hlw-avatar--large .hlw-avatar__initial[data-v-89dcbc96] { font-size: var(--font-xl, 40rpx);
34
34
  }
35
-
35
+ .hlw-btn[data-v-199073be] {
36
+ display: inline-flex;
37
+ align-items: center;
38
+ justify-content: center;
39
+ gap: 8rpx;
40
+ border: none;
41
+ font-weight: 500;
42
+ line-height: 1;
43
+ transition: opacity 0.2s;
44
+ }
45
+ .hlw-btn[data-v-199073be]::after {
46
+ display: none;
47
+ }
48
+ .hlw-btn[data-v-199073be]:active {
49
+ opacity: 0.7;
50
+ }
51
+ .hlw-btn--primary[data-v-199073be] {
52
+ background: var(--primary-color);
53
+ color: #fff;
54
+ }
55
+ .hlw-btn--outline[data-v-199073be] {
56
+ background: transparent;
57
+ color: var(--primary-color);
58
+ border: 2rpx solid var(--primary-color);
59
+ }
60
+ .hlw-btn--text[data-v-199073be] {
61
+ background: transparent;
62
+ color: var(--primary-color);
63
+ }
64
+ .hlw-btn--ghost[data-v-199073be] {
65
+ background: transparent;
66
+ color: #fff;
67
+ border: 2rpx solid rgba(255, 255, 255, 0.6);
68
+ }
69
+ .hlw-btn--small[data-v-199073be] {
70
+ padding: 8rpx 20rpx;
71
+ font-size: var(--font-xs, 20rpx);
72
+ border-radius: var(--radius-sm, 8rpx);
73
+ }
74
+ .hlw-btn--medium[data-v-199073be] {
75
+ padding: 16rpx 32rpx;
76
+ font-size: var(--font-sm, 24rpx);
77
+ border-radius: var(--radius-md, 16rpx);
78
+ }
79
+ .hlw-btn--large[data-v-199073be] {
80
+ padding: 24rpx 48rpx;
81
+ font-size: var(--font-base, 28rpx);
82
+ border-radius: var(--radius-md, 16rpx);
83
+ }
84
+ .hlw-btn--block[data-v-199073be] {
85
+ display: flex;
86
+ width: 100%;
87
+ }
88
+ .hlw-btn--round[data-v-199073be] {
89
+ border-radius: 999rpx;
90
+ }
91
+ .hlw-btn--disabled[data-v-199073be] {
92
+ opacity: 0.4;
93
+ }
94
+ .hlw-btn--disabled[data-v-199073be]:active {
95
+ opacity: 0.4;
96
+ }
97
+ .hlw-btn--loading[data-v-199073be] {
98
+ opacity: 0.7;
99
+ }
100
+ .hlw-btn-icon[data-v-199073be] {
101
+ font-size: 1.1em;
102
+ }
103
+ .hlw-btn-spinner[data-v-199073be] {
104
+ width: 28rpx;
105
+ height: 28rpx;
106
+ border: 3rpx solid currentColor;
107
+ border-top-color: transparent;
108
+ border-radius: 50%;
109
+ animation: hlw-spin-199073be 0.6s linear infinite;
110
+ }
111
+ @keyframes hlw-spin-199073be {
112
+ to {
113
+ transform: rotate(360deg);
114
+ }
115
+ }
36
116
  .hlw-card[data-v-cf55252e] {
37
117
  width: 100%;
38
118
  background: #fff;
@@ -121,6 +201,80 @@
121
201
  .hlw-card-footer-right[data-v-cf55252e] {
122
202
  flex-shrink: 0;
123
203
  margin-left: 16rpx;
204
+ }.hlw-cell[data-v-2bd8c24d] {
205
+ display: flex;
206
+ align-items: center;
207
+ padding: 24rpx 32rpx;
208
+ background: #fff;
209
+ gap: 20rpx;
210
+ }
211
+ .hlw-cell--border[data-v-2bd8c24d] {
212
+ border-bottom: 1rpx solid var(--border-color-light, #f1f5f9);
213
+ }
214
+ .hlw-cell--border[data-v-2bd8c24d]:last-child {
215
+ border-bottom: none;
216
+ }
217
+ .hlw-cell--hover[data-v-2bd8c24d] {
218
+ background: #f8fafc;
219
+ }
220
+ .hlw-cell-icon[data-v-2bd8c24d] {
221
+ font-size: var(--font-lg, 36rpx);
222
+ color: var(--primary-color, #3b82f6);
223
+ flex-shrink: 0;
224
+ }
225
+ .hlw-cell-body[data-v-2bd8c24d] {
226
+ flex: 1;
227
+ min-width: 0;
228
+ display: flex;
229
+ align-items: center;
230
+ justify-content: space-between;
231
+ }
232
+ .hlw-cell-title[data-v-2bd8c24d] {
233
+ font-size: var(--font-base, 28rpx);
234
+ color: #1e293b;
235
+ }
236
+ .hlw-cell-label[data-v-2bd8c24d] {
237
+ font-size: var(--font-xs, 20rpx);
238
+ color: #94a3b8;
239
+ margin-top: 4rpx;
240
+ }
241
+ .hlw-cell-value[data-v-2bd8c24d] {
242
+ font-size: var(--font-sm, 24rpx);
243
+ color: #94a3b8;
244
+ flex-shrink: 0;
245
+ }
246
+ .hlw-cell-arrow[data-v-2bd8c24d] {
247
+ width: 16rpx;
248
+ height: 16rpx;
249
+ border-top: 3rpx solid #c0c4cc;
250
+ border-right: 3rpx solid #c0c4cc;
251
+ transform: rotate(45deg);
252
+ flex-shrink: 0;
253
+ }.hlw-divider[data-v-e34c6f87] {
254
+ display: flex;
255
+ align-items: center;
256
+ padding: 24rpx 0;
257
+ }
258
+ .hlw-divider-line[data-v-e34c6f87] {
259
+ flex: 1;
260
+ height: 1rpx;
261
+ background: var(--border-color, #e2e8f0);
262
+ }
263
+ .hlw-divider--dashed .hlw-divider-line[data-v-e34c6f87] {
264
+ background: none;
265
+ border-top: 1rpx dashed var(--border-color, #e2e8f0);
266
+ }
267
+ .hlw-divider-text[data-v-e34c6f87] {
268
+ padding: 0 24rpx;
269
+ font-size: var(--font-xs, 20rpx);
270
+ color: #94a3b8;
271
+ white-space: nowrap;
272
+ }
273
+ .hlw-divider--left .hlw-divider-line[data-v-e34c6f87]:first-child {
274
+ max-width: 60rpx;
275
+ }
276
+ .hlw-divider--right .hlw-divider-line[data-v-e34c6f87]:last-child {
277
+ max-width: 60rpx;
124
278
  }
125
279
  .hlw-empty[data-v-08b8d8fe] {
126
280
  display: flex;
@@ -439,6 +593,121 @@ from {
439
593
  to {
440
594
  transform: rotate(360deg);
441
595
  }
596
+ }.hlw-modal-mask[data-v-fa78c7c6] {
597
+ position: fixed;
598
+ inset: 0;
599
+ display: flex;
600
+ align-items: center;
601
+ justify-content: center;
602
+ background: rgba(0, 0, 0, 0.5);
603
+ z-index: 1000;
604
+ animation: hlw-fade-in-fa78c7c6 0.2s;
605
+ }
606
+ .hlw-modal[data-v-fa78c7c6] {
607
+ width: 80%;
608
+ max-width: 600rpx;
609
+ background: #fff;
610
+ border-radius: var(--radius-xl, 32rpx);
611
+ overflow: hidden;
612
+ animation: hlw-scale-in-fa78c7c6 0.25s ease;
613
+ }
614
+ .hlw-modal-title[data-v-fa78c7c6] {
615
+ padding: 40rpx 32rpx 0;
616
+ text-align: center;
617
+ font-size: var(--font-md, 32rpx);
618
+ font-weight: 600;
619
+ color: #1e293b;
620
+ }
621
+ .hlw-modal-body[data-v-fa78c7c6] {
622
+ padding: 32rpx;
623
+ font-size: var(--font-base, 28rpx);
624
+ color: #475569;
625
+ text-align: center;
626
+ line-height: 1.6;
627
+ }
628
+ .hlw-modal-footer[data-v-fa78c7c6] {
629
+ display: flex;
630
+ border-top: 1rpx solid var(--border-color-light, #f1f5f9);
631
+ }
632
+ .hlw-modal-btn[data-v-fa78c7c6] {
633
+ flex: 1;
634
+ padding: 24rpx 0;
635
+ text-align: center;
636
+ font-size: var(--font-base, 28rpx);
637
+ font-weight: 500;
638
+ }
639
+ .hlw-modal-btn[data-v-fa78c7c6]:active {
640
+ background: #f8fafc;
641
+ }
642
+ .hlw-modal-btn--cancel[data-v-fa78c7c6] {
643
+ color: #64748b;
644
+ border-right: 1rpx solid var(--border-color-light, #f1f5f9);
645
+ }
646
+ .hlw-modal-btn--confirm[data-v-fa78c7c6] {
647
+ color: var(--primary-color, #3b82f6);
648
+ }
649
+ @keyframes hlw-fade-in-fa78c7c6 {
650
+ from {
651
+ opacity: 0;
652
+ }
653
+ to {
654
+ opacity: 1;
655
+ }
656
+ }
657
+ @keyframes hlw-scale-in-fa78c7c6 {
658
+ from {
659
+ transform: scale(0.9);
660
+ opacity: 0;
661
+ }
662
+ to {
663
+ transform: scale(1);
664
+ opacity: 1;
665
+ }
666
+ }.hlw-notice[data-v-e3f87071] {
667
+ display: flex;
668
+ align-items: center;
669
+ padding: 16rpx 24rpx;
670
+ gap: 12rpx;
671
+ font-size: var(--font-sm, 24rpx);
672
+ }
673
+ .hlw-notice-left-icon[data-v-e3f87071] {
674
+ flex-shrink: 0;
675
+ font-size: var(--font-base, 28rpx);
676
+ }
677
+ .hlw-notice-wrap[data-v-e3f87071] {
678
+ flex: 1;
679
+ overflow: hidden;
680
+ white-space: nowrap;
681
+ }
682
+ .hlw-notice-scroll[data-v-e3f87071] {
683
+ display: inline-block;
684
+ white-space: nowrap;
685
+ animation: hlw-notice-scroll-e3f87071 linear infinite;
686
+ padding-left: 100%;
687
+ }
688
+ .hlw-notice-text[data-v-e3f87071] {
689
+ display: inline;
690
+ }
691
+ .hlw-notice-text--ellipsis[data-v-e3f87071] {
692
+ display: block;
693
+ overflow: hidden;
694
+ text-overflow: ellipsis;
695
+ white-space: nowrap;
696
+ }
697
+ .hlw-notice-close[data-v-e3f87071] {
698
+ flex-shrink: 0;
699
+ font-size: 32rpx;
700
+ line-height: 1;
701
+ opacity: 0.6;
702
+ padding: 0 4rpx;
703
+ }
704
+ @keyframes hlw-notice-scroll-e3f87071 {
705
+ 0% {
706
+ transform: translateX(0);
707
+ }
708
+ 100% {
709
+ transform: translateX(-100%);
710
+ }
442
711
  }.hlw-page[data-v-d8833363] {
443
712
  width: 100%;
444
713
  height: 100vh;
@@ -456,4 +725,281 @@ to {
456
725
  }
457
726
  .hlw-page-footer[data-v-d8833363] {
458
727
  flex-shrink: 0;
728
+ }.hlw-popup-mask[data-v-a6f8d1a5] {
729
+ position: fixed;
730
+ inset: 0;
731
+ background: rgba(0, 0, 0, 0.5);
732
+ z-index: 1000;
733
+ animation: hlw-fade-in-a6f8d1a5 0.25s;
734
+ }
735
+ .hlw-popup[data-v-a6f8d1a5] {
736
+ position: fixed;
737
+ z-index: 1001;
738
+ background: #fff;
739
+ transition: transform 0.3s ease, opacity 0.3s ease;
740
+ }
741
+ .hlw-popup--bottom[data-v-a6f8d1a5] {
742
+ left: 0;
743
+ right: 0;
744
+ bottom: 0;
745
+ max-height: 80vh;
746
+ transform: translateY(100%);
747
+ }
748
+ .hlw-popup--bottom.hlw-popup--show[data-v-a6f8d1a5] {
749
+ transform: translateY(0);
750
+ }
751
+ .hlw-popup--bottom.hlw-popup--round[data-v-a6f8d1a5] {
752
+ border-radius: var(--radius-xl, 32rpx) var(--radius-xl, 32rpx) 0 0;
753
+ }
754
+ .hlw-popup--top[data-v-a6f8d1a5] {
755
+ left: 0;
756
+ right: 0;
757
+ top: 0;
758
+ max-height: 80vh;
759
+ transform: translateY(-100%);
760
+ }
761
+ .hlw-popup--top.hlw-popup--show[data-v-a6f8d1a5] {
762
+ transform: translateY(0);
763
+ }
764
+ .hlw-popup--top.hlw-popup--round[data-v-a6f8d1a5] {
765
+ border-radius: 0 0 var(--radius-xl, 32rpx) var(--radius-xl, 32rpx);
766
+ }
767
+ .hlw-popup--center[data-v-a6f8d1a5] {
768
+ left: 50%;
769
+ top: 50%;
770
+ width: 80%;
771
+ transform: translate(-50%, -50%) scale(0.9);
772
+ opacity: 0;
773
+ border-radius: var(--radius-xl, 32rpx);
774
+ }
775
+ .hlw-popup--center.hlw-popup--show[data-v-a6f8d1a5] {
776
+ transform: translate(-50%, -50%) scale(1);
777
+ opacity: 1;
778
+ }
779
+ .hlw-popup-header[data-v-a6f8d1a5] {
780
+ display: flex;
781
+ align-items: center;
782
+ justify-content: space-between;
783
+ padding: 28rpx 32rpx;
784
+ border-bottom: 1rpx solid var(--border-color-light, #f1f5f9);
785
+ }
786
+ .hlw-popup-title[data-v-a6f8d1a5] {
787
+ font-size: var(--font-md, 32rpx);
788
+ font-weight: 600;
789
+ color: #1e293b;
790
+ }
791
+ .hlw-popup-close[data-v-a6f8d1a5] {
792
+ font-size: 40rpx;
793
+ color: #94a3b8;
794
+ line-height: 1;
795
+ padding: 0 8rpx;
796
+ }
797
+ @keyframes hlw-fade-in-a6f8d1a5 {
798
+ from {
799
+ opacity: 0;
800
+ }
801
+ to {
802
+ opacity: 1;
803
+ }
804
+ }.hlw-search[data-v-761affc9] {
805
+ padding: 16rpx 24rpx;
806
+ }
807
+ .hlw-search-box[data-v-761affc9] {
808
+ display: flex;
809
+ align-items: center;
810
+ gap: 12rpx;
811
+ padding: 12rpx 24rpx;
812
+ background: #f1f5f9;
813
+ border-radius: var(--radius-md, 16rpx);
814
+ }
815
+ .hlw-search-box--round[data-v-761affc9] {
816
+ border-radius: 999rpx;
817
+ }
818
+ .hlw-search-icon[data-v-761affc9] {
819
+ font-size: var(--font-sm, 24rpx);
820
+ flex-shrink: 0;
821
+ opacity: 0.5;
822
+ }
823
+ .hlw-search-input[data-v-761affc9] {
824
+ flex: 1;
825
+ font-size: var(--font-sm, 24rpx);
826
+ color: #1e293b;
827
+ min-height: 40rpx;
828
+ }
829
+ .hlw-search-clear[data-v-761affc9] {
830
+ font-size: 32rpx;
831
+ color: #94a3b8;
832
+ line-height: 1;
833
+ flex-shrink: 0;
834
+ padding: 0 4rpx;
835
+ }.hlw-skeleton[data-v-c2d1fca4] {
836
+ display: flex;
837
+ gap: 24rpx;
838
+ padding: 24rpx;
839
+ }
840
+ .hlw-skeleton-avatar[data-v-c2d1fca4] {
841
+ flex-shrink: 0;
842
+ border-radius: 50%;
843
+ background: #e2e8f0;
844
+ }
845
+ .hlw-skeleton-avatar--small[data-v-c2d1fca4] {
846
+ width: 56rpx;
847
+ height: 56rpx;
848
+ }
849
+ .hlw-skeleton-avatar--medium[data-v-c2d1fca4] {
850
+ width: 80rpx;
851
+ height: 80rpx;
852
+ }
853
+ .hlw-skeleton-avatar--large[data-v-c2d1fca4] {
854
+ width: 120rpx;
855
+ height: 120rpx;
856
+ }
857
+ .hlw-skeleton-content[data-v-c2d1fca4] {
858
+ flex: 1;
859
+ display: flex;
860
+ flex-direction: column;
861
+ gap: 20rpx;
862
+ }
863
+ .hlw-skeleton-title[data-v-c2d1fca4] {
864
+ width: 40%;
865
+ height: 32rpx;
866
+ border-radius: 6rpx;
867
+ background: #e2e8f0;
868
+ }
869
+ .hlw-skeleton-row[data-v-c2d1fca4] {
870
+ height: 24rpx;
871
+ border-radius: 6rpx;
872
+ background: #e2e8f0;
873
+ }
874
+ .hlw-skeleton--animate .hlw-skeleton-avatar[data-v-c2d1fca4],
875
+ .hlw-skeleton--animate .hlw-skeleton-title[data-v-c2d1fca4],
876
+ .hlw-skeleton--animate .hlw-skeleton-row[data-v-c2d1fca4] {
877
+ animation: hlw-skeleton-pulse-c2d1fca4 1.5s ease-in-out infinite;
878
+ }
879
+ @keyframes hlw-skeleton-pulse-c2d1fca4 {
880
+ 0% {
881
+ opacity: 1;
882
+ }
883
+ 50% {
884
+ opacity: 0.4;
885
+ }
886
+ 100% {
887
+ opacity: 1;
888
+ }
889
+ }.hlw-tabs[data-v-f6f0b949] {
890
+ background: #fff;
891
+ white-space: nowrap;
892
+ }
893
+ .hlw-tabs-wrap[data-v-f6f0b949] {
894
+ display: inline-flex;
895
+ min-width: 100%;
896
+ }
897
+ .hlw-tab[data-v-f6f0b949] {
898
+ position: relative;
899
+ flex: 1;
900
+ display: flex;
901
+ align-items: center;
902
+ justify-content: center;
903
+ padding: 24rpx 28rpx;
904
+ gap: 6rpx;
905
+ transition: color 0.2s;
906
+ }
907
+ .hlw-tab--active .hlw-tab-text[data-v-f6f0b949] {
908
+ color: var(--primary-color, #3b82f6);
909
+ font-weight: 600;
910
+ }
911
+ .hlw-tab-text[data-v-f6f0b949] {
912
+ font-size: var(--font-base, 28rpx);
913
+ color: #64748b;
914
+ }
915
+ .hlw-tab-badge[data-v-f6f0b949] {
916
+ padding: 0 8rpx;
917
+ min-width: 28rpx;
918
+ height: 28rpx;
919
+ line-height: 28rpx;
920
+ font-size: 18rpx;
921
+ text-align: center;
922
+ color: #fff;
923
+ background: #ef4444;
924
+ border-radius: 999rpx;
925
+ }
926
+ .hlw-tab-line[data-v-f6f0b949] {
927
+ position: absolute;
928
+ bottom: 4rpx;
929
+ left: 50%;
930
+ transform: translateX(-50%);
931
+ height: 6rpx;
932
+ border-radius: 6rpx;
933
+ background: var(--primary-color, #3b82f6);
934
+ transition: width 0.2s;
935
+ }.hlw-tag[data-v-42e75bd0] {
936
+ display: inline-flex;
937
+ align-items: center;
938
+ gap: 4rpx;
939
+ font-weight: 500;
940
+ border: 2rpx solid transparent;
941
+ }
942
+ .hlw-tag--medium[data-v-42e75bd0] {
943
+ padding: 4rpx 16rpx;
944
+ font-size: var(--font-xs, 20rpx);
945
+ border-radius: var(--radius-sm, 8rpx);
946
+ }
947
+ .hlw-tag--small[data-v-42e75bd0] {
948
+ padding: 2rpx 10rpx;
949
+ font-size: 18rpx;
950
+ border-radius: 6rpx;
951
+ }
952
+ .hlw-tag--round[data-v-42e75bd0] {
953
+ border-radius: 999rpx;
954
+ }
955
+ .hlw-tag--primary[data-v-42e75bd0] {
956
+ background: var(--primary-color, #3b82f6);
957
+ color: #fff;
958
+ border-color: var(--primary-color, #3b82f6);
959
+ }
960
+ .hlw-tag--primary.hlw-tag--plain[data-v-42e75bd0] {
961
+ background: transparent;
962
+ color: var(--primary-color, #3b82f6);
963
+ }
964
+ .hlw-tag--success[data-v-42e75bd0] {
965
+ background: #10b981;
966
+ color: #fff;
967
+ border-color: #10b981;
968
+ }
969
+ .hlw-tag--success.hlw-tag--plain[data-v-42e75bd0] {
970
+ background: transparent;
971
+ color: #10b981;
972
+ }
973
+ .hlw-tag--warning[data-v-42e75bd0] {
974
+ background: #f59e0b;
975
+ color: #fff;
976
+ border-color: #f59e0b;
977
+ }
978
+ .hlw-tag--warning.hlw-tag--plain[data-v-42e75bd0] {
979
+ background: transparent;
980
+ color: #f59e0b;
981
+ }
982
+ .hlw-tag--danger[data-v-42e75bd0] {
983
+ background: #ef4444;
984
+ color: #fff;
985
+ border-color: #ef4444;
986
+ }
987
+ .hlw-tag--danger.hlw-tag--plain[data-v-42e75bd0] {
988
+ background: transparent;
989
+ color: #ef4444;
990
+ }
991
+ .hlw-tag--info[data-v-42e75bd0] {
992
+ background: #64748b;
993
+ color: #fff;
994
+ border-color: #64748b;
995
+ }
996
+ .hlw-tag--info.hlw-tag--plain[data-v-42e75bd0] {
997
+ background: transparent;
998
+ color: #64748b;
999
+ }
1000
+ .hlw-tag-close[data-v-42e75bd0] {
1001
+ font-size: 1.2em;
1002
+ line-height: 1;
1003
+ margin-left: 2rpx;
1004
+ opacity: 0.8;
459
1005
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hlw-uni/mp-vue",
3
- "version": "1.0.34",
3
+ "version": "1.1.0",
4
4
  "description": "hlw-uni Vue 组件库 — 供小程序业务方使用的 UI 组件集合",
5
5
  "main": "src/index.ts",
6
6
  "module": "src/index.ts",
@@ -26,19 +26,19 @@
26
26
  "access": "public"
27
27
  },
28
28
  "peerDependencies": {
29
- "vue": ">=3.4.0",
30
- "pinia": ">=2.0.0"
29
+ "pinia": ">=2.0.0",
30
+ "vue": ">=3.4.0"
31
31
  },
32
32
  "devDependencies": {
33
- "@dcloudio/types": "^3.4.8",
34
- "@types/node": "^20.11.0",
35
- "@vitejs/plugin-vue": "^5.0.0",
36
- "typescript": "^4.9.4",
33
+ "@dcloudio/types": "^3.4.30",
34
+ "@types/node": "^20.19.39",
35
+ "@vitejs/plugin-vue": "^5.2.4",
36
+ "typescript": "^4.9.5",
37
37
  "vite": "5.2.8",
38
38
  "vite-plugin-dts": "^4.5.4",
39
- "vue": "^3.4.0"
39
+ "vue": "^3.5.32"
40
40
  },
41
41
  "dependencies": {
42
- "@hlw-uni/mp-core": "^1.0.10"
42
+ "@hlw-uni/mp-core": "^1.0.28"
43
43
  }
44
44
  }
@@ -0,0 +1,116 @@
1
+ <template>
2
+ <button
3
+ class="hlw-btn"
4
+ :class="[
5
+ `hlw-btn--${type}`,
6
+ `hlw-btn--${size}`,
7
+ { 'hlw-btn--block': block, 'hlw-btn--round': round, 'hlw-btn--disabled': disabled, 'hlw-btn--loading': loading },
8
+ ]"
9
+ :disabled="disabled || loading"
10
+ :open-type="openType"
11
+ @tap="$emit('click')"
12
+ >
13
+ <view v-if="loading" class="hlw-btn-spinner" />
14
+ <view v-else-if="icon" :class="icon" class="hlw-btn-icon" />
15
+ <slot />
16
+ </button>
17
+ </template>
18
+
19
+ <script setup lang="ts">
20
+ interface Props {
21
+ type?: "primary" | "outline" | "text" | "ghost";
22
+ size?: "small" | "medium" | "large";
23
+ loading?: boolean;
24
+ disabled?: boolean;
25
+ block?: boolean;
26
+ round?: boolean;
27
+ icon?: string;
28
+ openType?: string;
29
+ }
30
+
31
+ withDefaults(defineProps<Props>(), {
32
+ type: "primary",
33
+ size: "medium",
34
+ loading: false,
35
+ disabled: false,
36
+ block: false,
37
+ round: false,
38
+ icon: "",
39
+ openType: "",
40
+ });
41
+
42
+ defineEmits<{ click: [] }>();
43
+ </script>
44
+
45
+ <style lang="scss" scoped>
46
+ .hlw-btn {
47
+ display: inline-flex;
48
+ align-items: center;
49
+ justify-content: center;
50
+ gap: 8rpx;
51
+ border: none;
52
+ font-weight: 500;
53
+ line-height: 1;
54
+ transition: opacity 0.2s;
55
+
56
+ &::after { display: none; }
57
+ &:active { opacity: 0.7; }
58
+
59
+ &--primary {
60
+ background: var(--primary-color);
61
+ color: #fff;
62
+ }
63
+ &--outline {
64
+ background: transparent;
65
+ color: var(--primary-color);
66
+ border: 2rpx solid var(--primary-color);
67
+ }
68
+ &--text {
69
+ background: transparent;
70
+ color: var(--primary-color);
71
+ }
72
+ &--ghost {
73
+ background: transparent;
74
+ color: #fff;
75
+ border: 2rpx solid rgba(255, 255, 255, 0.6);
76
+ }
77
+
78
+ &--small {
79
+ padding: 8rpx 20rpx;
80
+ font-size: var(--font-xs, 20rpx);
81
+ border-radius: var(--radius-sm, 8rpx);
82
+ }
83
+ &--medium {
84
+ padding: 16rpx 32rpx;
85
+ font-size: var(--font-sm, 24rpx);
86
+ border-radius: var(--radius-md, 16rpx);
87
+ }
88
+ &--large {
89
+ padding: 24rpx 48rpx;
90
+ font-size: var(--font-base, 28rpx);
91
+ border-radius: var(--radius-md, 16rpx);
92
+ }
93
+
94
+ &--block { display: flex; width: 100%; }
95
+ &--round { border-radius: 999rpx; }
96
+ &--disabled { opacity: 0.4; &:active { opacity: 0.4; } }
97
+ &--loading { opacity: 0.7; }
98
+ }
99
+
100
+ .hlw-btn-icon {
101
+ font-size: 1.1em;
102
+ }
103
+
104
+ .hlw-btn-spinner {
105
+ width: 28rpx;
106
+ height: 28rpx;
107
+ border: 3rpx solid currentColor;
108
+ border-top-color: transparent;
109
+ border-radius: 50%;
110
+ animation: hlw-spin 0.6s linear infinite;
111
+ }
112
+
113
+ @keyframes hlw-spin {
114
+ to { transform: rotate(360deg); }
115
+ }
116
+ </style>