@hlw-uni/mp-vue 1.1.0 → 1.1.2
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/index.js +39 -33
- package/dist/index.mjs +39 -33
- package/dist/style.css +155 -154
- package/package.json +1 -1
- package/src/components/hlw-avatar/index.vue +15 -0
- package/src/components/hlw-button/index.vue +25 -0
- package/src/components/hlw-cell/index.vue +30 -0
- package/src/components/hlw-divider/index.vue +20 -0
- package/src/components/hlw-empty/index.vue +3 -2
- package/src/components/hlw-header/index.vue +28 -0
- package/src/components/hlw-loading/index.vue +13 -0
- package/src/components/hlw-modal/index.vue +14 -4
- package/src/components/hlw-notice-bar/index.vue +5 -5
- package/src/components/hlw-page/index.vue +24 -0
- package/src/components/hlw-popup/index.vue +3 -3
- package/src/components/hlw-search/index.vue +6 -6
- package/src/components/hlw-skeleton/index.vue +23 -0
- package/src/components/hlw-tabs/index.vue +22 -0
- package/src/components/hlw-tag/index.vue +2 -2
package/package.json
CHANGED
|
@@ -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
|
-
<
|
|
5
|
-
<text class="hlw-empty__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
|
}>();
|
|
@@ -1,14 +1,22 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<view v-if="show" class="hlw-modal-mask" @tap.self="onMask">
|
|
3
|
-
<view class="hlw-modal" :class="{ 'hlw-modal--show': show }">
|
|
3
|
+
<view class="hlw-modal" :class="{ 'hlw-modal--show': show }" @tap.stop>
|
|
4
4
|
<view v-if="title" class="hlw-modal-title">{{ title }}</view>
|
|
5
5
|
<view class="hlw-modal-body">
|
|
6
6
|
<slot />
|
|
7
7
|
</view>
|
|
8
8
|
<slot name="footer">
|
|
9
9
|
<view class="hlw-modal-footer">
|
|
10
|
-
<view
|
|
11
|
-
|
|
10
|
+
<view
|
|
11
|
+
v-if="showCancel"
|
|
12
|
+
class="hlw-modal-btn hlw-modal-btn--cancel"
|
|
13
|
+
@tap.stop="onCancel"
|
|
14
|
+
>
|
|
15
|
+
{{ cancelText }}
|
|
16
|
+
</view>
|
|
17
|
+
<view class="hlw-modal-btn hlw-modal-btn--confirm" @tap.stop="onConfirm">
|
|
18
|
+
{{ confirmText }}
|
|
19
|
+
</view>
|
|
12
20
|
</view>
|
|
13
21
|
</slot>
|
|
14
22
|
</view>
|
|
@@ -25,7 +33,7 @@ interface Props {
|
|
|
25
33
|
closeOnMask?: boolean;
|
|
26
34
|
}
|
|
27
35
|
|
|
28
|
-
withDefaults(defineProps<Props>(), {
|
|
36
|
+
const props = withDefaults(defineProps<Props>(), {
|
|
29
37
|
show: false,
|
|
30
38
|
title: "",
|
|
31
39
|
showCancel: true,
|
|
@@ -41,6 +49,7 @@ function close() {
|
|
|
41
49
|
}
|
|
42
50
|
|
|
43
51
|
function onMask() {
|
|
52
|
+
if (!props.closeOnMask) return;
|
|
44
53
|
close();
|
|
45
54
|
}
|
|
46
55
|
|
|
@@ -110,6 +119,7 @@ function onCancel() {
|
|
|
110
119
|
color: #64748b;
|
|
111
120
|
border-right: 1rpx solid var(--border-color-light, #f1f5f9);
|
|
112
121
|
}
|
|
122
|
+
|
|
113
123
|
&--confirm {
|
|
114
124
|
color: var(--primary-color, #3b82f6);
|
|
115
125
|
}
|
|
@@ -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"
|
|
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"
|
|
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 {
|
|
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:
|
|
89
|
+
font-size: 28rpx;
|
|
90
90
|
line-height: 1;
|
|
91
91
|
opacity: 0.6;
|
|
92
|
-
padding:
|
|
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"
|
|
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:
|
|
98
|
+
font-size: 32rpx;
|
|
99
99
|
color: #94a3b8;
|
|
100
100
|
line-height: 1;
|
|
101
|
-
padding:
|
|
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"
|
|
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"
|
|
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:
|
|
50
|
-
emit("update:modelValue", e
|
|
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:
|
|
89
|
+
font-size: 28rpx;
|
|
90
90
|
color: #94a3b8;
|
|
91
91
|
line-height: 1;
|
|
92
92
|
flex-shrink: 0;
|
|
93
|
-
padding:
|
|
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')"
|
|
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:
|
|
71
|
+
font-size: 1em;
|
|
72
72
|
line-height: 1;
|
|
73
73
|
margin-left: 2rpx;
|
|
74
74
|
opacity: 0.8;
|