@hlw-uni/mp-vue 2.1.57 → 2.1.58

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.
Files changed (46) hide show
  1. package/dist/app.d.ts +12 -1
  2. package/dist/composables/ad/index.d.ts +26 -0
  3. package/dist/composables/device/index.d.ts +14 -0
  4. package/dist/composables/index.d.ts +1 -1
  5. package/dist/composables/msg/index.d.ts +44 -3
  6. package/dist/composables/navigator/index.d.ts +37 -1
  7. package/dist/composables/refs/index.d.ts +15 -1
  8. package/dist/composables/request/client.d.ts +87 -0
  9. package/dist/composables/request/service.d.ts +64 -0
  10. package/dist/composables/request/types.d.ts +50 -13
  11. package/dist/composables/share/index.d.ts +38 -0
  12. package/dist/composables/theme/appearance.d.ts +30 -4
  13. package/dist/composables/theme/font.d.ts +23 -0
  14. package/dist/composables/theme/index.d.ts +19 -6
  15. package/dist/composables/theme/palette.d.ts +23 -0
  16. package/dist/composables/theme/typography.d.ts +9 -1
  17. package/dist/composables/utils/index.d.ts +120 -13
  18. package/dist/directives/copy.d.ts +5 -0
  19. package/dist/hlw.d.ts +10 -0
  20. package/dist/index.js +305 -199
  21. package/dist/index.mjs +306 -200
  22. package/dist/stores/theme.d.ts +3 -0
  23. package/package.json +1 -1
  24. package/src/app.ts +20 -3
  25. package/src/components/hlw-add-mini/README.md +10 -11
  26. package/src/components/hlw-add-mini/index.vue +93 -66
  27. package/src/components/hlw-button/index.vue +33 -18
  28. package/src/composables/ad/index.ts +136 -62
  29. package/src/composables/device/index.ts +32 -2
  30. package/src/composables/index.ts +18 -1
  31. package/src/composables/msg/index.ts +70 -16
  32. package/src/composables/navigator/index.ts +45 -1
  33. package/src/composables/refs/index.ts +27 -4
  34. package/src/composables/request/client.ts +149 -0
  35. package/src/composables/request/service.ts +64 -0
  36. package/src/composables/request/types.ts +53 -13
  37. package/src/composables/share/index.ts +48 -0
  38. package/src/composables/theme/appearance.ts +31 -4
  39. package/src/composables/theme/font.ts +23 -0
  40. package/src/composables/theme/index.ts +23 -7
  41. package/src/composables/theme/palette.ts +32 -0
  42. package/src/composables/theme/typography.ts +9 -1
  43. package/src/composables/utils/index.ts +227 -127
  44. package/src/directives/copy.ts +31 -19
  45. package/src/hlw.ts +11 -0
  46. package/src/stores/theme.ts +28 -5
@@ -2,6 +2,9 @@ import { FontScale, ThemeColor, Appearance, AppearanceMode, AppearancePreset } f
2
2
  import { StoreDefinition } from 'pinia';
3
3
  import { Ref, ComputedRef } from 'vue';
4
4
 
5
+ /**
6
+ * 统一管理全局主题、字体缩放和外观模式的 Pinia Store。
7
+ */
5
8
  export declare const useThemeStore: StoreDefinition<"theme", Pick<{
6
9
  scale: Ref<FontScale, FontScale>;
7
10
  fontOptions: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hlw-uni/mp-vue",
3
- "version": "2.1.57",
3
+ "version": "2.1.58",
4
4
  "description": "hlw-uni 小程序运行时 — Vue 组件 + composables + theme + http + 工具集(合并自原 mp-core)",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
package/src/app.ts CHANGED
@@ -9,14 +9,27 @@ import { useRequest } from '@/composables/request';
9
9
  let _installed = false;
10
10
 
11
11
  /**
12
- * 创建 uni-app 应用入口工具。
12
+ * 创建 uni-app 应用入口与全局插件配置工具。
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * import { useApp } from '@hlw-uni/mp-vue';
17
+ * import App from './App.vue';
18
+ * import { createPinia } from 'pinia';
19
+ *
20
+ * const app = useApp();
21
+ * app.use(createPinia());
22
+ * export const createApp = app.install(App);
23
+ * ```
13
24
  */
14
25
  export function useApp() {
15
- /** 用于在导出前挂载插件。 */
26
+ /** 用于在导出前挂载的插件列表 */
16
27
  const _plugins: Array<(app: App) => void> = [];
17
28
 
18
29
  /**
19
- * 注册一个待安装的应用插件。
30
+ * 注册一个待安装的 Vue 插件(例如 Pinia、Router 或组件库)。
31
+ *
32
+ * @param pluginOrInstaller Vue 插件或插件安装函数
20
33
  */
21
34
  function use(pluginOrInstaller: any) {
22
35
  _plugins.push((app) => app.use(pluginOrInstaller));
@@ -24,6 +37,9 @@ export function useApp() {
24
37
 
25
38
  /**
26
39
  * 生成符合 uni-app 约定的 createApp 入口函数。
40
+ *
41
+ * @param AppComponent 根组件 (通常是 App.vue)
42
+ * @returns 返回符合 uni-app 要求的 createApp 函数
27
43
  */
28
44
  function install(AppComponent: Component) {
29
45
  if (_installed) {
@@ -46,3 +62,4 @@ export function useApp() {
46
62
 
47
63
  return { install, use, hlw, request: useRequest() };
48
64
  }
65
+
@@ -1,17 +1,16 @@
1
- #添加小程序指引,可适配自定义导航栏
1
+ # 添加到我的小程序提示
2
2
 
3
- | 参数 | 说明 | 类型 | 默认值 | 其他 |
4
- | :---- | :---- | :---- | :---- | :---- |
5
- | navigationStyle | 顶部导航栏样式 | String | default | 可选值 custom |
3
+ 轻量提示用户从右上角菜单添加小程序。
4
+
5
+ | 参数 | 说明 | 类型 | 默认值 |
6
+ | :-- | :-- | :-- | :-- |
7
+ | show | 是否显示 | Boolean | false |
8
+ | navigationStyle | 顶部导航栏样式,可选 `default`、`custom` | String | default |
9
+ | title | 标题 | String | 添加到我的小程序 |
10
+ | desc | 描述 | String | 点击右上角 ··· 添加 |
6
11
 
7
- #case
8
- # 作者:douyin0516
9
12
  ```vue
10
13
  <template>
11
- <view>
12
- <hlw-add-mini :show="show" @close="close" />
13
- </view>
14
+ <hlw-add-mini :show="show" @close="close" />
14
15
  </template>
15
-
16
-
17
16
  ```
@@ -1,110 +1,137 @@
1
1
  <template>
2
- <view v-if="props.show" class="box" :style="{ top }">
3
- <image class="close" :src="close_icon" @click="close" />
4
- <view class="fs_12">
5
- <view class="">点击右上方“···”</view>
6
- <view class="">选择“添加到我的小程序”</view>
7
- </view>
8
- <image class="image" mode="widthfix" :src="add_miniprogram" />
9
- <view class="fs_12">
10
- <view class="">回到微信首页</view>
11
- <view class="">向下拉动便可查看</view>
2
+ <view v-if="props.show" class="hlw-add-mini" :style="{ top }">
3
+ <view class="hlw-add-mini__arrow" />
4
+ <view class="hlw-add-mini__content">
5
+ <view class="hlw-add-mini__text">
6
+ <view class="hlw-add-mini__title">{{ props.title }}</view>
7
+ <view v-if="props.desc" class="hlw-add-mini__desc">{{ props.desc }}</view>
8
+ </view>
9
+ <view class="hlw-add-mini__close" @tap="close">×</view>
12
10
  </view>
13
11
  </view>
14
12
  </template>
15
13
 
16
14
  <script setup lang="ts">
15
+ /**
16
+ * HlwAddMini - 添加小程序提示气泡组件
17
+ *
18
+ * 用于提示用户点击右上角将当前小程序“添加到我的小程序”中,以提升用户留存。
19
+ * 会根据是否为自定义导航栏(custom),自动调整气泡浮动位置(避开胶囊按钮与状态栏)。
20
+ */
17
21
  import { computed } from "vue";
22
+ import { useDevice } from "../../composables/device";
18
23
 
19
24
  defineOptions({ name: "HlwAddMini" });
20
25
 
21
26
  interface Props {
27
+ /** 是否显示提示气泡 */
22
28
  show?: boolean;
29
+ /** 页面导航栏样式:default (系统默认) | custom (自定义导航) */
23
30
  navigationStyle?: "default" | "custom";
31
+ /** 气泡主标题文字 */
32
+ title?: string;
33
+ /** 气泡副标题/描述文字 */
34
+ desc?: string;
24
35
  }
25
36
 
26
37
  const props = withDefaults(defineProps<Props>(), {
27
38
  show: false,
28
39
  navigationStyle: "default",
40
+ title: "添加到我的小程序",
41
+ desc: "点击右上角 ··· 添加",
29
42
  });
30
43
 
31
- const emit = defineEmits<{ close: [] }>();
32
-
33
- const assets = {
34
- add_miniprogram:
35
- 'data:image/png;base64,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',
36
- close_icon:
37
- 'data:image/png;base64,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',
38
- };
44
+ const emit = defineEmits<{
45
+ /** 点击关闭按钮时触发 */
46
+ close: []
47
+ }>();
39
48
 
40
- const add_miniprogram = assets.add_miniprogram;
41
- const close_icon = assets.close_icon;
49
+ // useDevice 获取缓存的设备系统信息,规避在 computed 中频繁调用同步系统 API 的性能问题
50
+ const { info } = useDevice();
42
51
 
43
52
  const top = computed(() =>
44
- props.navigationStyle === "custom" ? `${uni.getSystemInfoSync().statusBarHeight + 50}px` : "6px"
53
+ props.navigationStyle === "custom" ? `${info.status_bar_height + 48}px` : "12px"
45
54
  );
46
55
 
56
+ /**
57
+ * 触发关闭气泡事件。
58
+ */
47
59
  function close() {
48
60
  emit("close");
49
61
  }
50
62
  </script>
51
63
 
52
64
  <style lang="scss" scoped>
53
- .box {
54
- width: 388rpx;
55
- height: 460rpx;
56
- padding: 60rpx 30rpx 40rpx;
57
- box-sizing: border-box;
58
- background: rgba(31, 31, 31, 0.9);
59
- color: #fff;
60
- text-align: center;
61
- font-size: 24rpx;
62
- border-radius: 24rpx;
65
+ .hlw-add-mini {
63
66
  position: fixed;
64
- right: 16px;
67
+ right: 22rpx;
65
68
  z-index: 32;
66
- letter-spacing: 0.5px;
67
- opacity: 0;
68
- animation: float 0.5s ease forwards;
69
-
70
- .fs_12 {
71
- display: flex;
72
- flex-direction: column;
73
- gap: 10rpx;
74
- }
69
+ width: 340rpx;
70
+ animation: hlw-add-mini-in 0.22s ease-out both;
71
+ }
75
72
 
76
- &:before {
77
- position: absolute;
78
- content: '';
79
- width: 0;
80
- height: 0;
81
- right: 52px;
82
- top: -28rpx;
83
- border: 14rpx solid transparent;
84
- border-bottom: 20rpx solid #333;
85
- }
86
- .image {
87
- margin: 30rpx 0;
88
- width: 320rpx;
89
- height: 160rpx;
90
- border-radius: 8rpx;
91
- }
92
- .close {
93
- position: absolute;
94
- left: 20rpx;
95
- top: 20rpx;
96
- z-index: 2;
97
- width: 44rpx;
98
- height: 44rpx;
99
- }
73
+ .hlw-add-mini__arrow {
74
+ position: absolute;
75
+ right: 56rpx;
76
+ top: -10rpx;
77
+ width: 20rpx;
78
+ height: 20rpx;
79
+ background: rgba(17, 24, 39, 0.82);
80
+ transform: rotate(45deg);
81
+ }
82
+
83
+ .hlw-add-mini__content {
84
+ display: flex;
85
+ align-items: center;
86
+ gap: 12rpx;
87
+ padding: 16rpx 14rpx 16rpx 20rpx;
88
+ border-radius: 14rpx;
89
+ background: rgba(17, 24, 39, 0.82);
90
+ box-shadow: 0 12rpx 34rpx rgba(15, 23, 42, 0.22);
100
91
  }
101
- @keyframes float {
92
+
93
+ .hlw-add-mini__text {
94
+ flex: 1;
95
+ min-width: 0;
96
+ }
97
+
98
+ .hlw-add-mini__title {
99
+ color: #ffffff;
100
+ font-size: 25rpx;
101
+ font-weight: 400;
102
+ line-height: 1.3;
103
+ letter-spacing: 1rpx;
104
+ }
105
+
106
+ .hlw-add-mini__desc {
107
+ margin-top: 4rpx;
108
+ color: rgba(255, 255, 255, 0.72);
109
+ font-size: 21rpx;
110
+ line-height: 1.3;
111
+ letter-spacing: 1rpx;
112
+ }
113
+
114
+ .hlw-add-mini__close {
115
+ display: flex;
116
+ align-items: center;
117
+ justify-content: center;
118
+ flex-shrink: 0;
119
+ width: 36rpx;
120
+ height: 36rpx;
121
+ color: rgba(255, 255, 255, 0.72);
122
+ font-size: 30rpx;
123
+ line-height: 1;
124
+ }
125
+
126
+ @keyframes hlw-add-mini-in {
102
127
  0% {
103
128
  opacity: 0;
129
+ transform: translateY(-8rpx);
104
130
  }
105
131
 
106
132
  100% {
107
133
  opacity: 1;
134
+ transform: translateY(0);
108
135
  }
109
136
  }
110
137
  </style>
@@ -35,8 +35,16 @@
35
35
  </template>
36
36
 
37
37
  <script setup lang="ts">
38
+ /**
39
+ * HlwButton - 语义化/响应式通用按钮组件
40
+ *
41
+ * 扩展了原生小程序 button 属性。支持丰富的语义色彩预设、尺寸自适应、圆角与 Block 状态,
42
+ * 并且内置了快捷的 uni-app 路由跳转逻辑与 Native `open-type` 会话消息配置。
43
+ */
38
44
  import { computed, useSlots } from "vue";
45
+ import { useNavigate } from "@/composables/navigator";
39
46
 
47
+ /** 按钮类型:语义化颜色预设、边框模式、文本模式及幽灵模式 */
40
48
  type ButtonType =
41
49
  | "primary"
42
50
  | "success"
@@ -48,22 +56,37 @@ type ButtonType =
48
56
  | "text"
49
57
  | "ghost";
50
58
 
59
+ /** 路由动作类型 */
51
60
  type NavigateType = "navigateTo" | "redirectTo" | "switchTab" | "reLaunch" | "navigateBack";
52
61
 
53
62
  interface Props {
63
+ /** 按钮类型 */
54
64
  type?: ButtonType;
65
+ /** 按钮尺寸大小 */
55
66
  size?: "small" | "medium" | "large";
67
+ /** 是否开启 Loading 载入状态,开启后按钮处于禁用状态且显示菊花加载器 */
56
68
  loading?: boolean;
69
+ /** 是否禁用按钮 */
57
70
  disabled?: boolean;
71
+ /** 是否独占整行(宽 100%) */
58
72
  block?: boolean;
73
+ /** 是否为椭圆胶囊形状(圆角为 999rpx) */
59
74
  round?: boolean;
75
+ /** 图标的 class 名称,若传入则在按钮内容前展示 */
60
76
  icon?: string;
77
+ /** 小程序原生的开放能力类型(如:share, contact, getUserInfo...) */
61
78
  openType?: string;
79
+ /** 自定义背景颜色(覆盖 type 预设) */
62
80
  bgColor?: string;
81
+ /** 自定义文字颜色(覆盖 type 预设) */
63
82
  textColor?: string;
83
+ /** 自定义边框颜色(覆盖 type 预设) */
64
84
  borderColor?: string;
85
+ /** 快捷跳转的目标路径 */
65
86
  url?: string;
87
+ /** 路由动作方式,默认 navigateTo */
66
88
  navigateType?: NavigateType;
89
+ /** 返回上级页面的层数,仅在 navigateType="navigateBack" 时有效 */
67
90
  delta?: number;
68
91
  /** open-type="contact" 时:用户进入会话时展示的自定义消息卡片标题 */
69
92
  sendMessageTitle?: string;
@@ -96,7 +119,10 @@ const props = withDefaults(defineProps<Props>(), {
96
119
  showMessageCard: false,
97
120
  });
98
121
 
99
- const emit = defineEmits<{ click: [] }>();
122
+ const emit = defineEmits<{
123
+ /** 按钮点击事件(在未禁用且非 loading 时触发) */
124
+ click: []
125
+ }>();
100
126
 
101
127
  const slots = useSlots();
102
128
  const hasIcon = computed(() => Boolean(props.icon || slots.icon));
@@ -118,6 +144,11 @@ const buttonStyle = computed(() => {
118
144
  return style;
119
145
  });
120
146
 
147
+ const navigator = useNavigate();
148
+
149
+ /**
150
+ * 处理点击事件与快捷页面跳转。
151
+ */
121
152
  const handleTap = () => {
122
153
  if (props.disabled || props.loading) return;
123
154
 
@@ -125,23 +156,7 @@ const handleTap = () => {
125
156
 
126
157
  if (!props.url && props.navigateType !== "navigateBack") return;
127
158
 
128
- switch (props.navigateType) {
129
- case "redirectTo":
130
- if (props.url) uni.redirectTo({ url: props.url });
131
- break;
132
- case "switchTab":
133
- if (props.url) uni.switchTab({ url: props.url });
134
- break;
135
- case "reLaunch":
136
- if (props.url) uni.reLaunch({ url: props.url });
137
- break;
138
- case "navigateBack":
139
- uni.navigateBack({ delta: props.delta });
140
- break;
141
- default:
142
- if (props.url) uni.navigateTo({ url: props.url });
143
- break;
144
- }
159
+ navigator.navigate(props.navigateType, props.url, { delta: props.delta });
145
160
  };
146
161
  </script>
147
162