@atooyu/uxto-ui 1.0.7 → 1.0.9

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
@@ -2238,46 +2238,46 @@ to {
2238
2238
  height: 100%;
2239
2239
  opacity: 0;
2240
2240
  z-index: 2;
2241
- }.u-skeleton[data-v-8f29b4c7] {
2241
+ }.u-skeleton[data-v-1fde8489] {
2242
2242
  display: flex;
2243
2243
  gap: 12px;
2244
2244
  }
2245
- .u-skeleton--animate .u-skeleton__avatar[data-v-8f29b4c7],
2246
- .u-skeleton--animate .u-skeleton__title[data-v-8f29b4c7],
2247
- .u-skeleton--animate .u-skeleton__paragraph[data-v-8f29b4c7] {
2248
- animation: skeleton-blink-8f29b4c7 1.2s ease-in-out infinite;
2245
+ .u-skeleton--animate .u-skeleton__avatar[data-v-1fde8489],
2246
+ .u-skeleton--animate .u-skeleton__title[data-v-1fde8489],
2247
+ .u-skeleton--animate .u-skeleton__paragraph[data-v-1fde8489] {
2248
+ animation: skeleton-blink-1fde8489 1.2s ease-in-out infinite;
2249
2249
  }
2250
- .u-skeleton__avatar[data-v-8f29b4c7] {
2250
+ .u-skeleton__avatar[data-v-1fde8489] {
2251
2251
  flex-shrink: 0;
2252
2252
  background-color: #f2f3f5;
2253
2253
  border-radius: 50%;
2254
2254
  }
2255
- .u-skeleton__avatar--circle[data-v-8f29b4c7] {
2255
+ .u-skeleton__avatar--circle[data-v-1fde8489] {
2256
2256
  border-radius: 50%;
2257
2257
  }
2258
- .u-skeleton__avatar--square[data-v-8f29b4c7] {
2258
+ .u-skeleton__avatar--square[data-v-1fde8489] {
2259
2259
  border-radius: 4px;
2260
2260
  }
2261
- .u-skeleton__content[data-v-8f29b4c7] {
2261
+ .u-skeleton__content[data-v-1fde8489] {
2262
2262
  flex: 1;
2263
2263
  min-width: 0;
2264
2264
  }
2265
- .u-skeleton__title[data-v-8f29b4c7] {
2265
+ .u-skeleton__title[data-v-1fde8489] {
2266
2266
  height: 20px;
2267
2267
  margin-bottom: 12px;
2268
2268
  background-color: #f2f3f5;
2269
2269
  border-radius: 4px;
2270
2270
  }
2271
- .u-skeleton__paragraphs[data-v-8f29b4c7] {
2271
+ .u-skeleton__paragraphs[data-v-1fde8489] {
2272
2272
  display: flex;
2273
2273
  flex-direction: column;
2274
2274
  gap: 8px;
2275
2275
  }
2276
- .u-skeleton__paragraph[data-v-8f29b4c7] {
2276
+ .u-skeleton__paragraph[data-v-1fde8489] {
2277
2277
  background-color: #f2f3f5;
2278
2278
  border-radius: 4px;
2279
2279
  }
2280
- @keyframes skeleton-blink-8f29b4c7 {
2280
+ @keyframes skeleton-blink-1fde8489 {
2281
2281
  0% {
2282
2282
  opacity: 1;
2283
2283
  }
@@ -2287,135 +2287,135 @@ to {
2287
2287
  100% {
2288
2288
  opacity: 1;
2289
2289
  }
2290
- }.u-transition[data-v-48c1ff4a] {
2290
+ }.u-transition[data-v-13f0f85c] {
2291
2291
  opacity: 1;
2292
2292
  transform: none;
2293
2293
  }
2294
- .u-transition--fade-enter[data-v-48c1ff4a] {
2294
+ .u-transition--fade-enter[data-v-13f0f85c] {
2295
2295
  opacity: 0;
2296
2296
  }
2297
- .u-transition--fade-leave[data-v-48c1ff4a] {
2297
+ .u-transition--fade-leave[data-v-13f0f85c] {
2298
2298
  opacity: 0;
2299
2299
  }
2300
- .u-transition--fade-up-enter[data-v-48c1ff4a] {
2300
+ .u-transition--fade-up-enter[data-v-13f0f85c] {
2301
2301
  opacity: 0;
2302
2302
  transform: translateY(100%);
2303
2303
  }
2304
- .u-transition--fade-up-leave[data-v-48c1ff4a] {
2304
+ .u-transition--fade-up-leave[data-v-13f0f85c] {
2305
2305
  opacity: 0;
2306
2306
  transform: translateY(-100%);
2307
2307
  }
2308
- .u-transition--fade-down-enter[data-v-48c1ff4a] {
2308
+ .u-transition--fade-down-enter[data-v-13f0f85c] {
2309
2309
  opacity: 0;
2310
2310
  transform: translateY(-100%);
2311
2311
  }
2312
- .u-transition--fade-down-leave[data-v-48c1ff4a] {
2312
+ .u-transition--fade-down-leave[data-v-13f0f85c] {
2313
2313
  opacity: 0;
2314
2314
  transform: translateY(100%);
2315
2315
  }
2316
- .u-transition--fade-left-enter[data-v-48c1ff4a] {
2316
+ .u-transition--fade-left-enter[data-v-13f0f85c] {
2317
2317
  opacity: 0;
2318
2318
  transform: translateX(100%);
2319
2319
  }
2320
- .u-transition--fade-left-leave[data-v-48c1ff4a] {
2320
+ .u-transition--fade-left-leave[data-v-13f0f85c] {
2321
2321
  opacity: 0;
2322
2322
  transform: translateX(-100%);
2323
2323
  }
2324
- .u-transition--fade-right-enter[data-v-48c1ff4a] {
2324
+ .u-transition--fade-right-enter[data-v-13f0f85c] {
2325
2325
  opacity: 0;
2326
2326
  transform: translateX(-100%);
2327
2327
  }
2328
- .u-transition--fade-right-leave[data-v-48c1ff4a] {
2328
+ .u-transition--fade-right-leave[data-v-13f0f85c] {
2329
2329
  opacity: 0;
2330
2330
  transform: translateX(100%);
2331
2331
  }
2332
- .u-transition--slide-up-enter[data-v-48c1ff4a] {
2332
+ .u-transition--slide-up-enter[data-v-13f0f85c] {
2333
2333
  transform: translateY(100%);
2334
2334
  }
2335
- .u-transition--slide-up-leave[data-v-48c1ff4a] {
2335
+ .u-transition--slide-up-leave[data-v-13f0f85c] {
2336
2336
  transform: translateY(-100%);
2337
2337
  }
2338
- .u-transition--slide-down-enter[data-v-48c1ff4a] {
2338
+ .u-transition--slide-down-enter[data-v-13f0f85c] {
2339
2339
  transform: translateY(-100%);
2340
2340
  }
2341
- .u-transition--slide-down-leave[data-v-48c1ff4a] {
2341
+ .u-transition--slide-down-leave[data-v-13f0f85c] {
2342
2342
  transform: translateY(100%);
2343
2343
  }
2344
- .u-transition--slide-left-enter[data-v-48c1ff4a] {
2344
+ .u-transition--slide-left-enter[data-v-13f0f85c] {
2345
2345
  transform: translateX(100%);
2346
2346
  }
2347
- .u-transition--slide-left-leave[data-v-48c1ff4a] {
2347
+ .u-transition--slide-left-leave[data-v-13f0f85c] {
2348
2348
  transform: translateX(-100%);
2349
2349
  }
2350
- .u-transition--slide-right-enter[data-v-48c1ff4a] {
2350
+ .u-transition--slide-right-enter[data-v-13f0f85c] {
2351
2351
  transform: translateX(-100%);
2352
2352
  }
2353
- .u-transition--slide-right-leave[data-v-48c1ff4a] {
2353
+ .u-transition--slide-right-leave[data-v-13f0f85c] {
2354
2354
  transform: translateX(100%);
2355
2355
  }
2356
- .u-transition--zoom-enter[data-v-48c1ff4a] {
2356
+ .u-transition--zoom-enter[data-v-13f0f85c] {
2357
2357
  transform: scale(0);
2358
2358
  }
2359
- .u-transition--zoom-leave[data-v-48c1ff4a] {
2359
+ .u-transition--zoom-leave[data-v-13f0f85c] {
2360
2360
  transform: scale(0);
2361
2361
  }
2362
- .u-transition--zoom-fade-enter[data-v-48c1ff4a] {
2362
+ .u-transition--zoom-fade-enter[data-v-13f0f85c] {
2363
2363
  opacity: 0;
2364
2364
  transform: scale(0.5);
2365
2365
  }
2366
- .u-transition--zoom-fade-leave[data-v-48c1ff4a] {
2366
+ .u-transition--zoom-fade-leave[data-v-13f0f85c] {
2367
2367
  opacity: 0;
2368
2368
  transform: scale(0.5);
2369
- }.u-link[data-v-264b49c0] {
2369
+ }.u-link[data-v-f60d6c27] {
2370
2370
  display: inline;
2371
2371
  color: #646566;
2372
2372
  font-size: inherit;
2373
2373
  word-break: break-all;
2374
2374
  }
2375
- .u-link--default[data-v-264b49c0] {
2375
+ .u-link--default[data-v-f60d6c27] {
2376
2376
  color: #646566;
2377
2377
  }
2378
- .u-link--primary[data-v-264b49c0] {
2378
+ .u-link--primary[data-v-f60d6c27] {
2379
2379
  color: #00a29a;
2380
2380
  }
2381
- .u-link--success[data-v-264b49c0] {
2381
+ .u-link--success[data-v-f60d6c27] {
2382
2382
  color: #07c160;
2383
2383
  }
2384
- .u-link--warning[data-v-264b49c0] {
2384
+ .u-link--warning[data-v-f60d6c27] {
2385
2385
  color: #ff976a;
2386
2386
  }
2387
- .u-link--danger[data-v-264b49c0] {
2387
+ .u-link--danger[data-v-f60d6c27] {
2388
2388
  color: #ee0a24;
2389
2389
  }
2390
- .u-link--underline[data-v-264b49c0] {
2390
+ .u-link--underline[data-v-f60d6c27] {
2391
2391
  text-decoration: underline;
2392
2392
  }
2393
- .u-link--disabled[data-v-264b49c0] {
2393
+ .u-link--disabled[data-v-f60d6c27] {
2394
2394
  color: #969799;
2395
2395
  opacity: 0.5;
2396
- }.u-read-more__content[data-v-e27ed42c] {
2396
+ }.u-read-more__content[data-v-b31720eb] {
2397
2397
  font-size: 14px;
2398
2398
  color: #323233;
2399
2399
  line-height: 1.6;
2400
2400
  word-break: break-all;
2401
2401
  }
2402
- .u-read-more__toggle[data-v-e27ed42c] {
2402
+ .u-read-more__toggle[data-v-b31720eb] {
2403
2403
  display: inline-flex;
2404
2404
  align-items: center;
2405
2405
  margin-top: 8px;
2406
2406
  color: #00a29a;
2407
2407
  font-size: 14px;
2408
2408
  }
2409
- .u-read-more__toggle[data-v-e27ed42c]:active {
2409
+ .u-read-more__toggle[data-v-b31720eb]:active {
2410
2410
  opacity: 0.7;
2411
2411
  }
2412
- .u-read-more__toggle-text[data-v-e27ed42c] {
2412
+ .u-read-more__toggle-text[data-v-b31720eb] {
2413
2413
  margin-right: 4px;
2414
2414
  }
2415
- .u-read-more__toggle-icon[data-v-e27ed42c] {
2415
+ .u-read-more__toggle-icon[data-v-b31720eb] {
2416
2416
  font-size: 12px;
2417
2417
  }
2418
- .u-tabbar[data-v-9b683b39] {
2418
+ .u-tabbar[data-v-a50e7599] {
2419
2419
  position: fixed;
2420
2420
  left: 0;
2421
2421
  right: 0;
@@ -2424,7 +2424,7 @@ to {
2424
2424
  width: 100%;
2425
2425
  pointer-events: none;
2426
2426
  }
2427
- .u-tabbar__nav-wrap[data-v-9b683b39] {
2427
+ .u-tabbar__nav-wrap[data-v-a50e7599] {
2428
2428
  pointer-events: auto;
2429
2429
  position: absolute;
2430
2430
  left: 14px;
@@ -2443,8 +2443,7 @@ to {
2443
2443
  padding: 0 8px;
2444
2444
  box-sizing: border-box;
2445
2445
  }
2446
- .u-tabbar__tab-btn[data-v-9b683b39] {
2447
- flex: 1;
2446
+ .u-tabbar__tab-btn[data-v-a50e7599] {
2448
2447
  height: 40px;
2449
2448
  border-radius: 20px;
2450
2449
  background: transparent;
@@ -2456,25 +2455,25 @@ to {
2456
2455
  transition: all 200ms ease;
2457
2456
  white-space: nowrap;
2458
2457
  overflow: hidden;
2459
- min-width: 0;
2458
+ padding: 0 16px;
2460
2459
  }
2461
- .u-tabbar__tab-btn--active[data-v-9b683b39] {
2460
+ .u-tabbar__tab-btn--active[data-v-a50e7599] {
2462
2461
  background: #ffffff;
2463
2462
  box-shadow: inset 0 0 0 1px rgba(17, 135, 128, 0.14);
2464
2463
  }
2465
- .u-tabbar__tab-text[data-v-9b683b39] {
2464
+ .u-tabbar__tab-text[data-v-a50e7599] {
2466
2465
  font-weight: 600;
2467
2466
  font-size: 14px;
2468
2467
  overflow: hidden;
2469
2468
  text-overflow: ellipsis;
2470
2469
  }
2471
- .u-tabbar__center[data-v-9b683b39] {
2470
+ .u-tabbar__center[data-v-a50e7599] {
2472
2471
  position: relative;
2473
2472
  width: 72px;
2474
2473
  height: 56px;
2475
2474
  flex-shrink: 0;
2476
2475
  }
2477
- .u-tabbar__center-btn[data-v-9b683b39] {
2476
+ .u-tabbar__center-btn[data-v-a50e7599] {
2478
2477
  position: absolute;
2479
2478
  left: 50%;
2480
2479
  top: -22px;
@@ -2492,21 +2491,21 @@ to {
2492
2491
  box-shadow: 0 8px 20px rgba(8, 112, 106, 0.25);
2493
2492
  transition: all 200ms ease;
2494
2493
  }
2495
- .u-tabbar__center-btn[data-v-9b683b39]:active {
2494
+ .u-tabbar__center-btn[data-v-a50e7599]:active {
2496
2495
  transform: translateX(-50%) scale(0.95);
2497
2496
  }
2498
- .u-tabbar__center-btn--active[data-v-9b683b39] {
2497
+ .u-tabbar__center-btn--active[data-v-a50e7599] {
2499
2498
  border-color: #12b6af;
2500
2499
  box-shadow: 0 8px 24px rgba(8, 112, 106, 0.35);
2501
2500
  }
2502
- .u-tabbar__center-brand[data-v-9b683b39] {
2501
+ .u-tabbar__center-brand[data-v-a50e7599] {
2503
2502
  font-size: 22px;
2504
2503
  line-height: 1;
2505
2504
  font-weight: 700;
2506
2505
  color: #12b6af;
2507
2506
  letter-spacing: 1px;
2508
2507
  }
2509
- .u-tabbar__center-text[data-v-9b683b39] {
2508
+ .u-tabbar__center-text[data-v-a50e7599] {
2510
2509
  font-size: 12px;
2511
2510
  letter-spacing: 0.5px;
2512
2511
  color: #12b6af;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atooyu/uxto-ui",
3
- "version": "1.0.7",
3
+ "version": "1.0.9",
4
4
  "description": "跨平台 UI 组件库 - 支持 Android、iOS、鸿蒙",
5
5
  "keywords": [
6
6
  "uxto-ui",
@@ -1,51 +1,51 @@
1
- // 组件导出
2
- export { default as UButton } from './u-button/u-button.vue'
3
- export { default as UInput } from './u-input/u-input.vue'
4
- export { default as UCell } from './u-cell/u-cell.vue'
5
- export { default as UCellGroup } from './u-cell-group/u-cell-group.vue'
6
- export { default as UModal } from './u-modal/u-modal.vue'
7
- export { default as UIcon } from './u-icon/u-icon.vue'
8
- // SVG 图标库
9
- export * from './u-icon/index'
10
- export { default as ULoading } from './u-loading/u-loading.vue'
11
- export { default as UTag } from './u-tag/u-tag.vue'
12
- export { default as USwitch } from './u-switch/u-switch.vue'
13
- export { default as UImage } from './u-image/u-image.vue'
14
- export { default as UDivider } from './u-divider/u-divider.vue'
15
- export { default as UNoticeBar } from './u-notice-bar/u-notice-bar.vue'
16
- export { default as ULayout } from './u-layout/u-layout.vue'
17
- export { default as UBadge } from './u-badge/u-badge.vue'
18
- export { default as ULoadingPage } from './u-loading-page/u-loading-page.vue'
19
- export { default as UParse } from './u-parse/u-parse.vue'
20
- export { default as UKeyboard } from './u-keyboard/u-keyboard.vue'
21
- export { default as UPicker } from './u-picker/u-picker.vue'
22
- export { default as UDatetimePicker } from './u-datetime-picker/u-datetime-picker.vue'
23
- export { default as URate } from './u-rate/u-rate.vue'
24
- export { default as UGrid } from './u-grid/u-grid.vue'
25
- export { default as UGridItem } from './u-grid-item/u-grid-item.vue'
26
- export { default as USwiper } from './u-swiper/u-swiper.vue'
27
- export { default as USwiperItem } from './u-swiper-item/u-swiper-item.vue'
28
- export { default as USearch } from './u-search/u-search.vue'
29
- export { default as UNumberBox } from './u-number-box/u-number-box.vue'
30
- export { default as UUpload } from './u-upload/u-upload.vue'
31
- export { default as UTextarea } from './u-textarea/u-textarea.vue'
32
- export { default as USlider } from './u-slider/u-slider.vue'
33
- export { default as UList } from './u-list/u-list.vue'
34
- export { default as UListItem } from './u-list-item/u-list-item.vue'
35
- export { default as ULineProgress } from './u-line-progress/u-line-progress.vue'
36
- export { default as UCountDown } from './u-count-down/u-count-down.vue'
37
- export { default as UTooltip } from './u-tooltip/u-tooltip.vue'
38
- export { default as UAvatar } from './u-avatar/u-avatar.vue'
39
- export { default as UEmpty } from './u-empty/u-empty.vue'
40
- export { default as UCheckbox } from './u-checkbox/u-checkbox.vue'
41
- export { default as UCheckboxGroup } from './u-checkbox-group/u-checkbox-group.vue'
42
- export { default as URadio } from './u-radio/u-radio.vue'
43
- export { default as URadioGroup } from './u-radio-group/u-radio-group.vue'
44
- export { default as UToast } from './u-toast/u-toast.vue'
45
- export { default as UPopup } from './u-popup/u-popup.vue'
46
- export { default as UCodeInput } from './u-code-input/u-code-input.vue'
47
- export { default as USkeleton } from './u-skeleton/u-skeleton.vue'
48
- export { default as UTransition } from './u-transition/u-transition.vue'
49
- export { default as ULink } from './u-link/u-link.vue'
50
- export { default as UReadMore } from './u-read-more/u-read-more.vue'
1
+ // 组件导出
2
+ export { default as UButton } from './u-button/u-button.vue'
3
+ export { default as UInput } from './u-input/u-input.vue'
4
+ export { default as UCell } from './u-cell/u-cell.vue'
5
+ export { default as UCellGroup } from './u-cell-group/u-cell-group.vue'
6
+ export { default as UModal } from './u-modal/u-modal.vue'
7
+ export { default as UIcon } from './u-icon/u-icon.vue'
8
+ // SVG 图标库
9
+ export * from './u-icon/index'
10
+ export { default as ULoading } from './u-loading/u-loading.vue'
11
+ export { default as UTag } from './u-tag/u-tag.vue'
12
+ export { default as USwitch } from './u-switch/u-switch.vue'
13
+ export { default as UImage } from './u-image/u-image.vue'
14
+ export { default as UDivider } from './u-divider/u-divider.vue'
15
+ export { default as UNoticeBar } from './u-notice-bar/u-notice-bar.vue'
16
+ export { default as ULayout } from './u-layout/u-layout.vue'
17
+ export { default as UBadge } from './u-badge/u-badge.vue'
18
+ export { default as ULoadingPage } from './u-loading-page/u-loading-page.vue'
19
+ export { default as UParse } from './u-parse/u-parse.vue'
20
+ export { default as UKeyboard } from './u-keyboard/u-keyboard.vue'
21
+ export { default as UPicker } from './u-picker/u-picker.vue'
22
+ export { default as UDatetimePicker } from './u-datetime-picker/u-datetime-picker.vue'
23
+ export { default as URate } from './u-rate/u-rate.vue'
24
+ export { default as UGrid } from './u-grid/u-grid.vue'
25
+ export { default as UGridItem } from './u-grid-item/u-grid-item.vue'
26
+ export { default as USwiper } from './u-swiper/u-swiper.vue'
27
+ export { default as USwiperItem } from './u-swiper-item/u-swiper-item.vue'
28
+ export { default as USearch } from './u-search/u-search.vue'
29
+ export { default as UNumberBox } from './u-number-box/u-number-box.vue'
30
+ export { default as UUpload } from './u-upload/u-upload.vue'
31
+ export { default as UTextarea } from './u-textarea/u-textarea.vue'
32
+ export { default as USlider } from './u-slider/u-slider.vue'
33
+ export { default as UList } from './u-list/u-list.vue'
34
+ export { default as UListItem } from './u-list-item/u-list-item.vue'
35
+ export { default as ULineProgress } from './u-line-progress/u-line-progress.vue'
36
+ export { default as UCountDown } from './u-count-down/u-count-down.vue'
37
+ export { default as UTooltip } from './u-tooltip/u-tooltip.vue'
38
+ export { default as UAvatar } from './u-avatar/u-avatar.vue'
39
+ export { default as UEmpty } from './u-empty/u-empty.vue'
40
+ export { default as UCheckbox } from './u-checkbox/u-checkbox.vue'
41
+ export { default as UCheckboxGroup } from './u-checkbox-group/u-checkbox-group.vue'
42
+ export { default as URadio } from './u-radio/u-radio.vue'
43
+ export { default as URadioGroup } from './u-radio-group/u-radio-group.vue'
44
+ export { default as UToast } from './u-toast/u-toast.vue'
45
+ export { default as UPopup } from './u-popup/u-popup.vue'
46
+ export { default as UCodeInput } from './u-code-input/u-code-input.vue'
47
+ export { default as USkeleton } from './u-skeleton/u-skeleton.vue'
48
+ export { default as UTransition } from './u-transition/u-transition.vue'
49
+ export { default as ULink } from './u-link/u-link.vue'
50
+ export { default as UReadMore } from './u-read-more/u-read-more.vue'
51
51
  export { default as UTabbar } from './u-tabbar/u-tabbar.vue'
@@ -1,113 +1,113 @@
1
- <template>
2
- <text
3
- class="u-link"
4
- :class="linkClass"
5
- :style="linkStyle"
6
- @click="handleClick"
7
- >
8
- <slot>{{ text }}</slot>
9
- </text>
10
- </template>
11
-
12
- <script setup lang="ts">
13
- import { computed } from 'vue'
14
-
15
- type LinkType = 'default' | 'primary' | 'success' | 'warning' | 'danger'
16
-
17
- interface Props {
18
- text?: string
19
- type?: LinkType
20
- color?: string
21
- underline?: boolean
22
- href?: string
23
- disabled?: boolean
24
- }
25
-
26
- const props = withDefaults(defineProps<Props>(), {
27
- text: '',
28
- type: 'default',
29
- underline: false,
30
- disabled: false
31
- })
32
-
33
- const emit = defineEmits<{
34
- (e: 'click'): void
35
- }>()
36
-
37
- const linkClass = computed(() => [
38
- `u-link--${props.type}`,
39
- {
40
- 'u-link--underline': props.underline,
41
- 'u-link--disabled': props.disabled
42
- }
43
- ])
44
-
45
- const linkStyle = computed(() => {
46
- const style: Record<string, string> = {}
47
- if (props.color) {
48
- style.color = props.color
49
- }
50
- return style
51
- })
52
-
53
- const handleClick = () => {
54
- if (props.disabled) return
55
-
56
- if (props.href) {
57
- // 在新窗口打开链接
58
- // uni-app 环境下使用特定方法
59
- // #ifdef H5
60
- window.open(props.href, '_blank')
61
- // #endif
62
- }
63
-
64
- emit('click')
65
- }
66
- </script>
67
-
68
- <script lang="ts">
69
- export default {
70
- options: {
71
- virtualHost: true,
72
- styleIsolation: 'shared'
73
- }
74
- }
75
- </script>
76
-
77
- <style lang="scss" scoped>
78
- .u-link {
79
- display: inline;
80
- color: $--text-color-2;
81
- font-size: inherit;
82
- word-break: break-all;
83
-
84
- &--default {
85
- color: $--text-color-2;
86
- }
87
-
88
- &--primary {
89
- color: $--color-primary;
90
- }
91
-
92
- &--success {
93
- color: $--color-success;
94
- }
95
-
96
- &--warning {
97
- color: $--color-warning;
98
- }
99
-
100
- &--danger {
101
- color: $--color-danger;
102
- }
103
-
104
- &--underline {
105
- text-decoration: underline;
106
- }
107
-
108
- &--disabled {
109
- color: $--text-color-3;
110
- opacity: 0.5;
111
- }
112
- }
1
+ <template>
2
+ <text
3
+ class="u-link"
4
+ :class="linkClass"
5
+ :style="linkStyle"
6
+ @click="handleClick"
7
+ >
8
+ <slot>{{ text }}</slot>
9
+ </text>
10
+ </template>
11
+
12
+ <script setup lang="ts">
13
+ import { computed } from 'vue'
14
+
15
+ type LinkType = 'default' | 'primary' | 'success' | 'warning' | 'danger'
16
+
17
+ interface Props {
18
+ text?: string
19
+ type?: LinkType
20
+ color?: string
21
+ underline?: boolean
22
+ href?: string
23
+ disabled?: boolean
24
+ }
25
+
26
+ const props = withDefaults(defineProps<Props>(), {
27
+ text: '',
28
+ type: 'default',
29
+ underline: false,
30
+ disabled: false
31
+ })
32
+
33
+ const emit = defineEmits<{
34
+ (e: 'click'): void
35
+ }>()
36
+
37
+ const linkClass = computed(() => [
38
+ `u-link--${props.type}`,
39
+ {
40
+ 'u-link--underline': props.underline,
41
+ 'u-link--disabled': props.disabled
42
+ }
43
+ ])
44
+
45
+ const linkStyle = computed(() => {
46
+ const style: Record<string, string> = {}
47
+ if (props.color) {
48
+ style.color = props.color
49
+ }
50
+ return style
51
+ })
52
+
53
+ const handleClick = () => {
54
+ if (props.disabled) return
55
+
56
+ if (props.href) {
57
+ // 在新窗口打开链接
58
+ // uni-app 环境下使用特定方法
59
+ // #ifdef H5
60
+ window.open(props.href, '_blank')
61
+ // #endif
62
+ }
63
+
64
+ emit('click')
65
+ }
66
+ </script>
67
+
68
+ <script lang="ts">
69
+ export default {
70
+ options: {
71
+ virtualHost: true,
72
+ styleIsolation: 'shared'
73
+ }
74
+ }
75
+ </script>
76
+
77
+ <style lang="scss" scoped>
78
+ .u-link {
79
+ display: inline;
80
+ color: $--text-color-2;
81
+ font-size: inherit;
82
+ word-break: break-all;
83
+
84
+ &--default {
85
+ color: $--text-color-2;
86
+ }
87
+
88
+ &--primary {
89
+ color: $--color-primary;
90
+ }
91
+
92
+ &--success {
93
+ color: $--color-success;
94
+ }
95
+
96
+ &--warning {
97
+ color: $--color-warning;
98
+ }
99
+
100
+ &--danger {
101
+ color: $--color-danger;
102
+ }
103
+
104
+ &--underline {
105
+ text-decoration: underline;
106
+ }
107
+
108
+ &--disabled {
109
+ color: $--text-color-3;
110
+ opacity: 0.5;
111
+ }
112
+ }
113
113
  </style>