@hlw-uni/mp-vue 1.1.0 → 1.1.1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hlw-uni/mp-vue",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
4
4
  "description": "hlw-uni Vue 组件库 — 供小程序业务方使用的 UI 组件集合",
5
5
  "main": "src/index.ts",
6
6
  "module": "src/index.ts",
@@ -14,6 +14,21 @@
14
14
  </template>
15
15
 
16
16
  <script setup lang="ts">
17
+ /**
18
+ * HlwAvatar — 头像组件
19
+ *
20
+ * 显示用户头像,图片加载失败时自动回退到姓名首字母占位。
21
+ *
22
+ * @props
23
+ * src - 头像图片地址
24
+ * name - 用户名称,用于提取首字母(图片缺失时显示)
25
+ * size - 尺寸:small(56rpx) / medium(80rpx) / large(120rpx),默认 medium
26
+ *
27
+ * @example
28
+ * ```vue
29
+ * <HlwAvatar src="/avatar.png" name="张三" size="large" />
30
+ * ```
31
+ */
17
32
  import { ref, computed } from 'vue';
18
33
 
19
34
  const props = defineProps<{
@@ -17,6 +17,31 @@
17
17
  </template>
18
18
 
19
19
  <script setup lang="ts">
20
+ /**
21
+ * HlwButton — 主题按钮
22
+ *
23
+ * 跟随 --primary-color 主题色,支持多种类型、尺寸和状态。
24
+ *
25
+ * @props
26
+ * type - 按钮类型:primary / outline / text / ghost,默认 primary
27
+ * size - 尺寸:small / medium / large,默认 medium
28
+ * loading - 加载状态(显示 spinner 并禁止点击),默认 false
29
+ * disabled - 禁用状态,默认 false
30
+ * block - 块级按钮(占满父容器宽度),默认 false
31
+ * round - 圆角药丸形状,默认 false
32
+ * icon - 左侧图标 class(如 i-fa6-solid-plus)
33
+ * openType - 微信原生 open-type(如 share、getPhoneNumber)
34
+ *
35
+ * @events
36
+ * click - 点击事件
37
+ *
38
+ * @example
39
+ * ```vue
40
+ * <HlwButton type="primary" @click="submit">提交</HlwButton>
41
+ * <HlwButton type="outline" loading>加载中</HlwButton>
42
+ * <HlwButton type="text" icon="i-fa6-solid-plus">新增</HlwButton>
43
+ * ```
44
+ */
20
45
  interface Props {
21
46
  type?: "primary" | "outline" | "text" | "ghost";
22
47
  size?: "small" | "medium" | "large";
@@ -33,6 +33,36 @@
33
33
  </template>
34
34
 
35
35
  <script setup lang="ts">
36
+ /**
37
+ * HlwCell — 列表单元格
38
+ *
39
+ * 通用列表项:左侧 icon + 标题/描述 + 右侧内容/箭头。
40
+ * 传入 url 自动渲染为 navigator 组件。
41
+ *
42
+ * @props
43
+ * title - 标题文字
44
+ * label - 描述文字(标题下方灰色小字)
45
+ * value - 右侧内容文字
46
+ * icon - 左侧图标 class(如 i-fa6-solid-gear)
47
+ * isLink - 是否显示右箭头,默认 false
48
+ * url - 跳转地址(有值则渲染为 navigator)
49
+ * border - 是否显示底部分割线,默认 true
50
+ *
51
+ * @events
52
+ * click - 点击事件(url 模式下由 navigator 处理跳转)
53
+ *
54
+ * @slots
55
+ * icon - 自定义左侧图标
56
+ * title - 自定义标题区域
57
+ * value - 自定义右侧内容
58
+ * right - 自定义最右侧区域
59
+ *
60
+ * @example
61
+ * ```vue
62
+ * <HlwCell title="设置" icon="i-fa6-solid-gear" is-link url="/pages/settings/index" />
63
+ * <HlwCell title="版本号" value="1.0.0" />
64
+ * ```
65
+ */
36
66
  interface Props {
37
67
  title?: string;
38
68
  label?: string;
@@ -9,6 +9,26 @@
9
9
  </template>
10
10
 
11
11
  <script setup lang="ts">
12
+ /**
13
+ * HlwDivider — 分割线
14
+ *
15
+ * 水平分割线,可带文字说明,支持虚线和文字位置调整。
16
+ *
17
+ * @props
18
+ * text - 分割线中间文字
19
+ * position - 文字位置:left / center / right,默认 center
20
+ * dashed - 是否虚线,默认 false
21
+ *
22
+ * @slots
23
+ * default - 自定义分割线中间内容(覆盖 text)
24
+ *
25
+ * @example
26
+ * ```vue
27
+ * <HlwDivider />
28
+ * <HlwDivider text="或" />
29
+ * <HlwDivider text="更多" position="left" dashed />
30
+ * ```
31
+ */
12
32
  interface Props {
13
33
  text?: string;
14
34
  position?: "left" | "center" | "right";
@@ -1,8 +1,8 @@
1
1
  <template>
2
2
  <view class="hlw-empty">
3
3
  <image v-if="image" class="hlw-empty__image" :src="image" mode="aspectFit" />
4
- <text v-else class="hlw-empty__icon">📦</text>
5
- <text class="hlw-empty__text">{{ text || '暂无数据' }}</text>
4
+ <view v-else class="hlw-empty__icon i-fa6-solid-box-open" />
5
+ <text class="hlw-empty__text">{{ text || "暂无数据" }}</text>
6
6
  <slot />
7
7
  </view>
8
8
  </template>
@@ -32,6 +32,7 @@ defineProps<{
32
32
  .hlw-empty__icon {
33
33
  font-size: 100rpx;
34
34
  margin-bottom: 20rpx;
35
+ color: #cbd5e1;
35
36
  }
36
37
 
37
38
  .hlw-empty__text {
@@ -34,6 +34,34 @@
34
34
  </template>
35
35
 
36
36
  <script setup lang="ts">
37
+ /**
38
+ * HlwHeader — 页面顶部导航栏
39
+ *
40
+ * 自动适配状态栏高度和胶囊按钮位置(微信小程序),支持返回按钮、自定义标题和背景。
41
+ *
42
+ * @props
43
+ * title - 标题文字
44
+ * titleAlign - 标题对齐:center / left,默认 center
45
+ * titleSize - 标题字号,默认 var(--font-base)
46
+ * titleWeight - 标题字重,默认 500
47
+ * titleColor - 标题颜色
48
+ * isBack - 是否显示返回按钮,默认 false
49
+ * bgClass - 自定义背景 CSS class
50
+ * extraHeight - 额外高度(rpx),默认 0
51
+ *
52
+ * @events
53
+ * back - 点击返回按钮
54
+ *
55
+ * @slots
56
+ * bg - 自定义背景层
57
+ * title - 自定义标题区域
58
+ * back-icon - 自定义返回图标
59
+ *
60
+ * @example
61
+ * ```vue
62
+ * <HlwHeader title="我的" is-back @back="goBack" />
63
+ * ```
64
+ */
37
65
  import { ref, computed, useSlots } from "vue";
38
66
 
39
67
  const getNavBarContentHeight = (): number => {
@@ -6,6 +6,19 @@
6
6
  </template>
7
7
 
8
8
  <script setup lang="ts">
9
+ /**
10
+ * HlwLoading — 加载动画组件
11
+ *
12
+ * 圆形旋转 spinner,可附带文字提示。
13
+ *
14
+ * @props
15
+ * text - 加载提示文字(可选)
16
+ *
17
+ * @example
18
+ * ```vue
19
+ * <HlwLoading text="加载中..." />
20
+ * ```
21
+ */
9
22
  defineProps<{
10
23
  text?: string;
11
24
  }>();
@@ -16,6 +16,36 @@
16
16
  </template>
17
17
 
18
18
  <script setup lang="ts">
19
+ /**
20
+ * HlwModal — 模态弹窗
21
+ *
22
+ * 比 uni.showModal 更灵活:支持插槽自定义内容和底部按钮。
23
+ * 使用 v-model:show 控制显隐。
24
+ *
25
+ * @props
26
+ * show - 是否显示,支持 v-model:show
27
+ * title - 标题文字
28
+ * showCancel - 是否显示取消按钮,默认 true
29
+ * confirmText - 确认按钮文字,默认 "确定"
30
+ * cancelText - 取消按钮文字,默认 "取消"
31
+ * closeOnMask - 点击蒙层是否关闭,默认 true
32
+ *
33
+ * @events
34
+ * update:show - 显隐状态变更
35
+ * confirm - 点击确认
36
+ * cancel - 点击取消
37
+ *
38
+ * @slots
39
+ * default - 弹窗内容
40
+ * footer - 自定义底部按钮区域(覆盖默认确认/取消)
41
+ *
42
+ * @example
43
+ * ```vue
44
+ * <HlwModal v-model:show="visible" title="提示" @confirm="onOk">
45
+ * <text>确定要删除吗?</text>
46
+ * </HlwModal>
47
+ * ```
48
+ */
19
49
  interface Props {
20
50
  show?: boolean;
21
51
  title?: string;
@@ -1,19 +1,19 @@
1
1
  <template>
2
2
  <view v-if="!closed" class="hlw-notice" :style="{ color, background }">
3
3
  <view v-if="leftIcon" :class="leftIcon" class="hlw-notice-left-icon" />
4
- <view v-else class="hlw-notice-left-icon">&#128227;</view>
4
+ <view v-else class="hlw-notice-left-icon i-fa6-solid-bullhorn" />
5
5
  <view class="hlw-notice-wrap" @tap="$emit('click')">
6
6
  <view v-if="scrollable" class="hlw-notice-scroll" :style="animStyle">
7
7
  <text class="hlw-notice-text">{{ text }}</text>
8
8
  </view>
9
9
  <text v-else class="hlw-notice-text hlw-notice-text--ellipsis">{{ text }}</text>
10
10
  </view>
11
- <view v-if="closable" class="hlw-notice-close" @tap="onClose">&#215;</view>
11
+ <view v-if="closable" class="hlw-notice-close i-fa6-solid-xmark" @tap="onClose" />
12
12
  </view>
13
13
  </template>
14
14
 
15
15
  <script setup lang="ts">
16
- import { ref, computed, onMounted } from "vue";
16
+ import { computed, ref } from "vue";
17
17
 
18
18
  interface Props {
19
19
  text?: string;
@@ -86,10 +86,10 @@ function onClose() {
86
86
 
87
87
  .hlw-notice-close {
88
88
  flex-shrink: 0;
89
- font-size: 32rpx;
89
+ font-size: 28rpx;
90
90
  line-height: 1;
91
91
  opacity: 0.6;
92
- padding: 0 4rpx;
92
+ padding: 4rpx;
93
93
  }
94
94
 
95
95
  @keyframes hlw-notice-scroll {
@@ -26,6 +26,30 @@
26
26
  </template>
27
27
 
28
28
  <script setup lang="ts">
29
+ /**
30
+ * HlwPage — 页面布局容器
31
+ *
32
+ * 全屏 flex 布局:固定 header + 可滚动 content + 固定 footer。
33
+ * 传入 title/isBack 自动渲染 HlwHeader,也可通过 header 插槽完全自定义。
34
+ *
35
+ * @props
36
+ * title - 页面标题(自动渲染 HlwHeader)
37
+ * isBack - 是否显示返回按钮,默认 false
38
+ * bgClass - header 背景 CSS class
39
+ *
40
+ * @slots
41
+ * header - 自定义顶部(覆盖默认 HlwHeader)
42
+ * default - 主体可滚动内容
43
+ * footer - 固定底部
44
+ *
45
+ * @example
46
+ * ```vue
47
+ * <HlwPage title="首页" bg-class="header-bg">
48
+ * <view>页面内容</view>
49
+ * <template #footer><view>底部栏</view></template>
50
+ * </HlwPage>
51
+ * ```
52
+ */
29
53
  interface Props {
30
54
  title?: string;
31
55
  isBack?: boolean;
@@ -3,7 +3,7 @@
3
3
  <view class="hlw-popup" :class="[`hlw-popup--${position}`, { 'hlw-popup--show': show, 'hlw-popup--round': round }]">
4
4
  <view v-if="title || closable" class="hlw-popup-header">
5
5
  <text class="hlw-popup-title">{{ title }}</text>
6
- <view v-if="closable" class="hlw-popup-close" @tap="onClose">&#215;</view>
6
+ <view v-if="closable" class="hlw-popup-close i-fa6-solid-xmark" @tap="onClose" />
7
7
  </view>
8
8
  <slot />
9
9
  </view>
@@ -95,10 +95,10 @@ function onClose() {
95
95
  }
96
96
 
97
97
  .hlw-popup-close {
98
- font-size: 40rpx;
98
+ font-size: 32rpx;
99
99
  color: #94a3b8;
100
100
  line-height: 1;
101
- padding: 0 8rpx;
101
+ padding: 4rpx;
102
102
  }
103
103
 
104
104
  @keyframes hlw-fade-in {
@@ -1,7 +1,7 @@
1
1
  <template>
2
2
  <view class="hlw-search" :style="background ? { background } : {}">
3
3
  <view class="hlw-search-box" :class="{ 'hlw-search-box--round': shape === 'round' }">
4
- <view class="hlw-search-icon">&#128269;</view>
4
+ <view class="hlw-search-icon i-fa6-solid-magnifying-glass" />
5
5
  <input
6
6
  class="hlw-search-input"
7
7
  type="text"
@@ -14,7 +14,7 @@
14
14
  @focus="$emit('focus')"
15
15
  @blur="$emit('blur')"
16
16
  />
17
- <view v-if="clearable && modelValue" class="hlw-search-clear" @tap="onClear">&#215;</view>
17
+ <view v-if="clearable && modelValue" class="hlw-search-clear i-fa6-solid-xmark" @tap="onClear" />
18
18
  </view>
19
19
  </view>
20
20
  </template>
@@ -46,8 +46,8 @@ const emit = defineEmits<{
46
46
  blur: [];
47
47
  }>();
48
48
 
49
- function onInput(e: { detail: { value: string } }) {
50
- emit("update:modelValue", e.detail.value);
49
+ function onInput(e: any) {
50
+ emit("update:modelValue", e?.detail?.value ?? "");
51
51
  }
52
52
 
53
53
  function onClear() {
@@ -86,10 +86,10 @@ function onClear() {
86
86
  }
87
87
 
88
88
  .hlw-search-clear {
89
- font-size: 32rpx;
89
+ font-size: 28rpx;
90
90
  color: #94a3b8;
91
91
  line-height: 1;
92
92
  flex-shrink: 0;
93
- padding: 0 4rpx;
93
+ padding: 4rpx;
94
94
  }
95
95
  </style>
@@ -10,6 +10,29 @@
10
10
  </template>
11
11
 
12
12
  <script setup lang="ts">
13
+ /**
14
+ * HlwSkeleton — 骨架屏
15
+ *
16
+ * 数据加载占位,支持头像 + 标题 + 多行文字组合。loading 为 false 时显示默认插槽内容。
17
+ *
18
+ * @props
19
+ * loading - 是否显示骨架屏,默认 true
20
+ * rows - 文字行数,默认 3
21
+ * avatar - 是否显示头像占位,默认 false
22
+ * title - 是否显示标题占位,默认 true
23
+ * animate - 是否启用脉冲动画,默认 true
24
+ * avatarSize - 头像尺寸:small / medium / large,默认 medium
25
+ *
26
+ * @slots
27
+ * default - 加载完成后显示的真实内容
28
+ *
29
+ * @example
30
+ * ```vue
31
+ * <HlwSkeleton :loading="loading" avatar :rows="4">
32
+ * <view>真实数据内容</view>
33
+ * </HlwSkeleton>
34
+ * ```
35
+ */
13
36
  interface Props {
14
37
  loading?: boolean;
15
38
  rows?: number;
@@ -20,6 +20,28 @@
20
20
  </template>
21
21
 
22
22
  <script setup lang="ts">
23
+ /**
24
+ * HlwTabs — 选项卡
25
+ *
26
+ * 横向选项卡切换,支持文字 / 对象配置、徽标和滚动模式。
27
+ * 激活项跟随 --primary-color 主题色。
28
+ *
29
+ * @props
30
+ * modelValue - 当前选中索引,支持 v-model,默认 0
31
+ * items - 选项列表:string[] 或 { label, badge? }[]
32
+ * scrollable - 超出时是否可横向滚动,默认 false
33
+ * lineWidth - 底部指示线宽度,默认 40rpx
34
+ *
35
+ * @events
36
+ * update:modelValue - 切换时触发
37
+ * change - 切换时触发(携带新索引)
38
+ *
39
+ * @example
40
+ * ```vue
41
+ * <HlwTabs v-model="activeTab" :items="['推荐', '热门', '最新']" />
42
+ * <HlwTabs v-model="tab" :items="[{ label: '消息', badge: '3' }, { label: '关注' }]" />
43
+ * ```
44
+ */
23
45
  export interface HlwTabItem {
24
46
  label: string;
25
47
  badge?: string;
@@ -6,7 +6,7 @@
6
6
  @tap="$emit('click')"
7
7
  >
8
8
  <slot />
9
- <view v-if="closable" class="hlw-tag-close" @tap.stop="$emit('close')">&#215;</view>
9
+ <view v-if="closable" class="hlw-tag-close i-fa6-solid-xmark" @tap.stop="$emit('close')" />
10
10
  </view>
11
11
  </template>
12
12
 
@@ -68,7 +68,7 @@ $colors: (
68
68
  }
69
69
 
70
70
  .hlw-tag-close {
71
- font-size: 1.2em;
71
+ font-size: 1em;
72
72
  line-height: 1;
73
73
  margin-left: 2rpx;
74
74
  opacity: 0.8;