@gm-mobile/c-react 3.9.3-beta.2 → 3.9.3-beta.20
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 +5 -5
- package/src/component/button/button.tsx +3 -1
- package/src/component/calendar/index.ts +1 -0
- package/src/component/cell/cell.tsx +29 -27
- package/src/component/cell/style.less +8 -5
- package/src/component/dialog/common/base.less +3 -0
- package/src/component/dialog/common/base.tsx +8 -4
- package/src/component/dialog/common/choose.tsx +3 -0
- package/src/component/dialog/dialog.tsx +6 -1
- package/src/component/dialog/types.ts +9 -8
- package/src/component/digital_keyboard/Base.tsx +13 -13
- package/src/component/digital_keyboard/Btn.ts +3 -3
- package/src/component/digital_keyboard/index.tsx +14 -10
- package/src/component/digital_keyboard/stories.tsx +35 -41
- package/src/component/draggable/draggable.tsx +1 -0
- package/src/component/error/error.tsx +23 -0
- package/src/component/error/index.ts +1 -0
- package/src/component/error/style.less +42 -0
- package/src/component/error/types.ts +5 -0
- package/src/component/layout_root/layout_root.tsx +0 -1
- package/src/component/page/style.less +8 -0
- package/src/component/popup/popup.tsx +4 -1
- package/src/component/popup/popup_v1.tsx +2 -1
- package/src/component/popup/style.less +1 -1
- package/src/component/popup/types.ts +4 -0
- package/src/component/text_field/TextField.tsx +13 -3
- package/src/component/text_field/stories.tsx +0 -1
- package/src/component/text_field/style.less +3 -0
- package/src/component/text_field/types.ts +1 -1
- package/src/index.less +4 -3
- package/src/index.ts +1 -0
- package/src/less/animation.less +9 -4
- package/src/less/bg.less +7 -0
- package/src/less/border.less +12 -3
- package/src/less/{btn.less → button.less} +3 -1
- package/src/less/distance.less +2 -0
- package/src/less/text.less +20 -24
- package/src/less/variable.less +0 -8
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gm-mobile/c-react",
|
|
3
|
-
"version": "3.9.3-beta.
|
|
3
|
+
"version": "3.9.3-beta.20",
|
|
4
4
|
"description": "> TODO: description",
|
|
5
5
|
"author": "liyatang <liyatang@qq.com>",
|
|
6
6
|
"homepage": "https://github.com/gmfe/gm-mobile#readme",
|
|
@@ -21,9 +21,9 @@
|
|
|
21
21
|
"url": "https://github.com/gmfe/gm-mobile/issues"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@gm-mobile/c-font": "^3.9.3-beta.
|
|
25
|
-
"@gm-mobile/c-tool": "^3.9.3-beta.
|
|
26
|
-
"@gm-mobile/locales": "^3.9.3-beta.
|
|
24
|
+
"@gm-mobile/c-font": "^3.9.3-beta.20",
|
|
25
|
+
"@gm-mobile/c-tool": "^3.9.3-beta.20",
|
|
26
|
+
"@gm-mobile/locales": "^3.9.3-beta.20"
|
|
27
27
|
},
|
|
28
28
|
"peerDependencies": {
|
|
29
29
|
"@tarojs/components": "3.0.18",
|
|
@@ -33,5 +33,5 @@
|
|
|
33
33
|
"prop-types": "^15.7.2",
|
|
34
34
|
"react": "^16.13.1"
|
|
35
35
|
},
|
|
36
|
-
"gitHead": "
|
|
36
|
+
"gitHead": "257d61e68ef1a76de48d9202a1a7b3c95c656f9d"
|
|
37
37
|
}
|
|
@@ -73,7 +73,9 @@ export const Button: FC<ButtonProps> = ({
|
|
|
73
73
|
onClick={handleClick}
|
|
74
74
|
>
|
|
75
75
|
{loadFlag && <Loading className='m-btn-loading' />}
|
|
76
|
-
<Flex alignCenter
|
|
76
|
+
<Flex alignCenter justifyCenter style={{ display: 'inline-flex' }}>
|
|
77
|
+
{children}
|
|
78
|
+
</Flex>
|
|
77
79
|
</BaseButton>
|
|
78
80
|
)
|
|
79
81
|
}
|
|
@@ -19,35 +19,37 @@ export const Cell: FC<CellProps> = ({
|
|
|
19
19
|
...rest
|
|
20
20
|
}) => {
|
|
21
21
|
return (
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
onClick={onClick}
|
|
35
|
-
>
|
|
36
|
-
{icon && <View className='m-cell-icon'>{icon}</View>}
|
|
37
|
-
{left && <View className='m-cell-left'>{left}</View>}
|
|
38
|
-
<View className='m-cell-body'>{children}</View>
|
|
39
|
-
<Flex alignCenter>
|
|
40
|
-
{right &&
|
|
41
|
-
(_.isString(right) ? (
|
|
42
|
-
<View className='m-cell-right'>{right}</View>
|
|
43
|
-
) : (
|
|
44
|
-
right
|
|
45
|
-
))}
|
|
46
|
-
{access && (
|
|
47
|
-
<Text className='m-font m-font-angle-right m-cell-access-icon' />
|
|
22
|
+
<>
|
|
23
|
+
<Flex
|
|
24
|
+
{...rest}
|
|
25
|
+
alignCenter
|
|
26
|
+
className={classNames(
|
|
27
|
+
'm-cell',
|
|
28
|
+
{
|
|
29
|
+
'm-cell-access': access,
|
|
30
|
+
'm-cell-with-icon': icon,
|
|
31
|
+
'm-cell-no-active': noActive,
|
|
32
|
+
},
|
|
33
|
+
className
|
|
48
34
|
)}
|
|
35
|
+
onClick={onClick}
|
|
36
|
+
>
|
|
37
|
+
{icon && <View className='m-cell-icon'>{icon}</View>}
|
|
38
|
+
{left && <View className='m-cell-left'>{left}</View>}
|
|
39
|
+
<View className='m-cell-body'>{children}</View>
|
|
40
|
+
<Flex alignCenter>
|
|
41
|
+
{right &&
|
|
42
|
+
(_.isString(right) ? (
|
|
43
|
+
<View className='m-cell-right'>{right}</View>
|
|
44
|
+
) : (
|
|
45
|
+
right
|
|
46
|
+
))}
|
|
47
|
+
{access && (
|
|
48
|
+
<Text className='m-font m-font-angle-right m-cell-access-icon' />
|
|
49
|
+
)}
|
|
50
|
+
</Flex>
|
|
49
51
|
</Flex>
|
|
50
|
-
|
|
52
|
+
</>
|
|
51
53
|
)
|
|
52
54
|
}
|
|
53
55
|
|
|
@@ -30,7 +30,6 @@
|
|
|
30
30
|
background: var(--m-color-bg-white);
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
|
-
.mCellBorderBottomAfter(15px, 0);
|
|
34
33
|
|
|
35
34
|
&.m-cell-access {
|
|
36
35
|
cursor: pointer;
|
|
@@ -41,10 +40,6 @@
|
|
|
41
40
|
}
|
|
42
41
|
}
|
|
43
42
|
|
|
44
|
-
&.m-cell-with-icon {
|
|
45
|
-
.mCellBorderBottomAfter(50px, 0);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
43
|
.m-cell-icon {
|
|
49
44
|
width: 35px;
|
|
50
45
|
}
|
|
@@ -105,4 +100,12 @@
|
|
|
105
100
|
.m-cell:not(.m-cell-form):last-child::after {
|
|
106
101
|
display: none;
|
|
107
102
|
}
|
|
103
|
+
|
|
104
|
+
.m-cell {
|
|
105
|
+
.mCellBorderBottomAfter(15px, 0);
|
|
106
|
+
|
|
107
|
+
&.m-cell-with-icon {
|
|
108
|
+
.mCellBorderBottomAfter(50px, 0);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
108
111
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React, { ReactNode } from 'react'
|
|
2
2
|
import { Flex, Popup, View, Button } from '../../..'
|
|
3
3
|
import { noop } from 'lodash'
|
|
4
|
+
import './base.less'
|
|
4
5
|
|
|
5
6
|
interface Option<T> {
|
|
6
7
|
title: ReactNode
|
|
@@ -54,7 +55,11 @@ export function showDialog<T>({
|
|
|
54
55
|
const Template = () => {
|
|
55
56
|
return (
|
|
56
57
|
<Flex column className='m-border-radius m-overflow-hidden m-bg-white'>
|
|
57
|
-
<Flex
|
|
58
|
+
<Flex
|
|
59
|
+
justifyBetween
|
|
60
|
+
alignCenter
|
|
61
|
+
className='m-customer-dialog-header m-padding-10'
|
|
62
|
+
>
|
|
58
63
|
<Flex flex>{left}</Flex>
|
|
59
64
|
<Flex
|
|
60
65
|
flex
|
|
@@ -68,7 +73,6 @@ export function showDialog<T>({
|
|
|
68
73
|
<Button
|
|
69
74
|
mini
|
|
70
75
|
plain
|
|
71
|
-
noRound
|
|
72
76
|
type='link'
|
|
73
77
|
className='m-text-desc m-margin-lr-0'
|
|
74
78
|
onClick={cancel}
|
|
@@ -81,7 +85,7 @@ export function showDialog<T>({
|
|
|
81
85
|
{children}
|
|
82
86
|
{bottom || (
|
|
83
87
|
<Flex className='m-padding-lr-10'>
|
|
84
|
-
<Button block
|
|
88
|
+
<Button block type='primary' onClick={() => ok()}>
|
|
85
89
|
{okText}
|
|
86
90
|
</Button>
|
|
87
91
|
</Flex>
|
|
@@ -94,7 +98,7 @@ export function showDialog<T>({
|
|
|
94
98
|
disabledHeader: true,
|
|
95
99
|
[direction]: true,
|
|
96
100
|
disabledAnimate: false,
|
|
97
|
-
onHide:
|
|
101
|
+
onHide: cancel,
|
|
98
102
|
children: <Template />,
|
|
99
103
|
})
|
|
100
104
|
})
|
|
@@ -24,6 +24,7 @@ export interface ChooseProps {
|
|
|
24
24
|
/** 搜索功能 */
|
|
25
25
|
// search?: boolean
|
|
26
26
|
maxHeight?: string
|
|
27
|
+
onCancel?: () => void
|
|
27
28
|
}
|
|
28
29
|
|
|
29
30
|
/** 底部弹出的选择界面 */
|
|
@@ -34,6 +35,7 @@ export default function ({
|
|
|
34
35
|
multiSelect = false,
|
|
35
36
|
defaultSelected = [],
|
|
36
37
|
maxHeight = '50vh',
|
|
38
|
+
onCancel,
|
|
37
39
|
}: ChooseProps) {
|
|
38
40
|
if (multiSelect) needConfirm = true
|
|
39
41
|
const selected = [...defaultSelected] as Item[]
|
|
@@ -93,6 +95,7 @@ export default function ({
|
|
|
93
95
|
title,
|
|
94
96
|
children: <Children />,
|
|
95
97
|
onOk: () => selected,
|
|
98
|
+
onCancel: onCancel,
|
|
96
99
|
bottom: needConfirm ? undefined : <View />,
|
|
97
100
|
})
|
|
98
101
|
return promise
|
|
@@ -44,6 +44,11 @@ const ErrorInput: FC<ErrorInputProps> = ({
|
|
|
44
44
|
|
|
45
45
|
const DialogStatics: DialogStaticsTypes<string | RenderOptions> = {
|
|
46
46
|
render(options, type) {
|
|
47
|
+
const autoHide = !(
|
|
48
|
+
typeof options === 'object' &&
|
|
49
|
+
options.onConfirm &&
|
|
50
|
+
typeof options.children === 'object'
|
|
51
|
+
)
|
|
47
52
|
if (typeof options === 'string') {
|
|
48
53
|
options = {
|
|
49
54
|
children: options as string,
|
|
@@ -92,7 +97,7 @@ const DialogStatics: DialogStaticsTypes<string | RenderOptions> = {
|
|
|
92
97
|
}
|
|
93
98
|
|
|
94
99
|
Promise.resolve(result).then(() => {
|
|
95
|
-
DialogStatics.hide()
|
|
100
|
+
if (autoHide) DialogStatics.hide()
|
|
96
101
|
|
|
97
102
|
return setTimeout(() => {
|
|
98
103
|
resolve(type === 'prompt' ? inputValue : undefined)
|
|
@@ -23,22 +23,23 @@ interface DialogBaseProps {
|
|
|
23
23
|
promptGetError?: (value: string) => string | void
|
|
24
24
|
hideBottom?: boolean
|
|
25
25
|
}
|
|
26
|
-
interface RenderOptions extends PromptOptions {
|
|
27
|
-
children?: string | React.ReactNode
|
|
28
|
-
confirmText?: React.ReactNode
|
|
29
|
-
onCancel?: () => void
|
|
30
|
-
otherText?: string
|
|
31
|
-
onOther?: () => void
|
|
32
|
-
hideBottom?: boolean
|
|
33
|
-
}
|
|
34
26
|
|
|
35
27
|
interface PromptOptions {
|
|
28
|
+
title?: string
|
|
36
29
|
promptGetError?: (value: string) => string | void
|
|
37
30
|
promptText?: string
|
|
38
31
|
promptInputProps?: ErrorInputProps
|
|
39
32
|
onConfirm?: (value: string) => void | boolean
|
|
40
33
|
}
|
|
41
34
|
|
|
35
|
+
interface RenderOptions extends PromptOptions {
|
|
36
|
+
children?: string | React.ReactNode
|
|
37
|
+
confirmText?: React.ReactNode
|
|
38
|
+
onCancel?: () => void
|
|
39
|
+
otherText?: string
|
|
40
|
+
onOther?: () => void
|
|
41
|
+
hideBottom?: boolean
|
|
42
|
+
}
|
|
42
43
|
interface DialogStaticsTypes<T> {
|
|
43
44
|
render: (options: T, type?: string) => Promise<void | string>
|
|
44
45
|
alert: (options: string | RenderOptions) => Promise<void | string>
|
|
@@ -2,7 +2,7 @@ import React, { FC, HTMLAttributes } from 'react'
|
|
|
2
2
|
// import { Flex, Popup, View } from '@gm-mobile/mp'
|
|
3
3
|
import _ from 'lodash'
|
|
4
4
|
import classNames from 'classnames'
|
|
5
|
-
import
|
|
5
|
+
import DKBtn from './Btn'
|
|
6
6
|
import './base.less'
|
|
7
7
|
import './font/iconfont.css'
|
|
8
8
|
import { View } from '../view'
|
|
@@ -11,11 +11,11 @@ import { Flex } from '../flex'
|
|
|
11
11
|
|
|
12
12
|
/** 数字按钮 */
|
|
13
13
|
export const defaultDigitalKeys = [
|
|
14
|
-
...['7', '8', '9'].map((v, _) => new
|
|
15
|
-
...['4', '5', '6'].map((v, _) => new
|
|
16
|
-
...['1', '2', '3'].map((v, _) => new
|
|
17
|
-
new
|
|
18
|
-
new
|
|
14
|
+
...['7', '8', '9'].map((v, _) => new DKBtn({ label: v })),
|
|
15
|
+
...['4', '5', '6'].map((v, _) => new DKBtn({ label: v })),
|
|
16
|
+
...['1', '2', '3'].map((v, _) => new DKBtn({ label: v })),
|
|
17
|
+
new DKBtn({ label: '0' }),
|
|
18
|
+
new DKBtn({
|
|
19
19
|
label: '.',
|
|
20
20
|
fn: (value = '') => {
|
|
21
21
|
if (value === '') {
|
|
@@ -28,7 +28,7 @@ export const defaultDigitalKeys = [
|
|
|
28
28
|
}
|
|
29
29
|
},
|
|
30
30
|
}),
|
|
31
|
-
new
|
|
31
|
+
new DKBtn({
|
|
32
32
|
className: 'iconfont icon-backspace',
|
|
33
33
|
fn: (value) => {
|
|
34
34
|
if (value.length === 0) return value
|
|
@@ -39,9 +39,9 @@ export const defaultDigitalKeys = [
|
|
|
39
39
|
|
|
40
40
|
/** 右侧功能按钮 */
|
|
41
41
|
export const defaultActionKeys = [
|
|
42
|
-
new
|
|
43
|
-
new
|
|
44
|
-
new
|
|
42
|
+
new DKBtn({ label: '取消', fn: (_) => '' }),
|
|
43
|
+
new DKBtn({ label: '完成', className: 'm-bg-primary' }),
|
|
44
|
+
new DKBtn({
|
|
45
45
|
label: '大按钮',
|
|
46
46
|
flex: 2,
|
|
47
47
|
className: 'm-bg-primary',
|
|
@@ -57,9 +57,9 @@ export interface KeyboardProps
|
|
|
57
57
|
/** 输入框当前值 */
|
|
58
58
|
value: string
|
|
59
59
|
/** 虚拟键盘的点击事件 */
|
|
60
|
-
onInput?: (value: string | undefined, key:
|
|
60
|
+
onInput?: (value: string | undefined, key: DKBtn) => void
|
|
61
61
|
/** 虚拟键盘的功能键(actionKeys)点击事件 */
|
|
62
|
-
onAction?: (key:
|
|
62
|
+
onAction?: (key: DKBtn) => void
|
|
63
63
|
/** 自定义功能键盘 */
|
|
64
64
|
actionKeys?: typeof defaultActionKeys
|
|
65
65
|
/** 自定义数字键盘 */
|
|
@@ -81,7 +81,7 @@ export const Keyboard: FC<KeyboardProps> = ({
|
|
|
81
81
|
int,
|
|
82
82
|
...rest
|
|
83
83
|
}) => {
|
|
84
|
-
const handleInput = (btn:
|
|
84
|
+
const handleInput = (btn: DKBtn) => {
|
|
85
85
|
if (!btn.fn) {
|
|
86
86
|
onInput && onInput(undefined, btn)
|
|
87
87
|
return
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export class
|
|
1
|
+
export class DKBtn {
|
|
2
2
|
/** 按钮文本 */
|
|
3
3
|
label?: string
|
|
4
4
|
/** 按钮占位,默认1个位置 */
|
|
@@ -8,7 +8,7 @@ export class Btn {
|
|
|
8
8
|
/** 按钮功能,传入value为输入框当前值,返回一个按钮功能处理后的值 */
|
|
9
9
|
fn?: (value: string) => string
|
|
10
10
|
type?: 'digit' | 'action'
|
|
11
|
-
constructor({ label = '', flex = 0, className = '', fn }:
|
|
11
|
+
constructor({ label = '', flex = 0, className = '', fn }: DKBtn) {
|
|
12
12
|
this.type = /([0-9.])/.test(label) ? 'digit' : 'action'
|
|
13
13
|
if (!fn && this.type === 'digit') {
|
|
14
14
|
fn = (value = '') => value + label
|
|
@@ -17,4 +17,4 @@ export class Btn {
|
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
export default
|
|
20
|
+
export default DKBtn
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import React, { ReactNode, useEffect, useState } from 'react'
|
|
1
|
+
import React, { ReactNode, useEffect, useRef, useState } from 'react'
|
|
2
2
|
import { makeObservable } from 'mobx'
|
|
3
3
|
import { Keyboard, KeyboardProps } from './Base'
|
|
4
4
|
import { observer } from 'mobx-react'
|
|
5
5
|
import { clamp } from 'lodash'
|
|
6
6
|
import { View } from '../view'
|
|
7
|
-
import
|
|
7
|
+
import { DKBtn } from './Btn'
|
|
8
8
|
import { Popup } from '../popup'
|
|
9
9
|
|
|
10
10
|
/** 是否小程序端 */
|
|
@@ -30,6 +30,7 @@ export type DigitalKeyboardProps = Omit<KeyboardProps, 'value' | 'int'> & {
|
|
|
30
30
|
min?: number
|
|
31
31
|
/** 最大值 */
|
|
32
32
|
max?: number
|
|
33
|
+
withUseRef?: boolean
|
|
33
34
|
}
|
|
34
35
|
|
|
35
36
|
export class DigitalKeyboard {
|
|
@@ -45,11 +46,12 @@ export class DigitalKeyboard {
|
|
|
45
46
|
min,
|
|
46
47
|
max,
|
|
47
48
|
style,
|
|
49
|
+
withUseRef = true,
|
|
48
50
|
...rest
|
|
49
51
|
}: DigitalKeyboardProps) {
|
|
50
52
|
this.form = form
|
|
51
53
|
this.active = active || Object.keys(form)[0]
|
|
52
|
-
const
|
|
54
|
+
const Node = observer(() => {
|
|
53
55
|
const sys = mp && wx.getSystemInfoSync()
|
|
54
56
|
const safeMargin =
|
|
55
57
|
withSafeArea && mp ? sys.screenHeight - sys.safeArea.bottom : 5
|
|
@@ -125,7 +127,7 @@ export class DigitalKeyboard {
|
|
|
125
127
|
</View>
|
|
126
128
|
)
|
|
127
129
|
})
|
|
128
|
-
this.
|
|
130
|
+
this.node = <Node />
|
|
129
131
|
makeObservable(this, {
|
|
130
132
|
form: true,
|
|
131
133
|
active: true,
|
|
@@ -135,6 +137,8 @@ export class DigitalKeyboard {
|
|
|
135
137
|
int: true,
|
|
136
138
|
setInt: true,
|
|
137
139
|
})
|
|
140
|
+
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
141
|
+
return withUseRef ? useRef(this).current : this
|
|
138
142
|
}
|
|
139
143
|
|
|
140
144
|
active: string
|
|
@@ -144,7 +148,7 @@ export class DigitalKeyboard {
|
|
|
144
148
|
}
|
|
145
149
|
|
|
146
150
|
/** 键盘组件 */
|
|
147
|
-
readonly
|
|
151
|
+
readonly node: ReactNode
|
|
148
152
|
/** 整数型键盘 */
|
|
149
153
|
int = false
|
|
150
154
|
/** 设置为整数型键盘 */
|
|
@@ -156,8 +160,8 @@ export class DigitalKeyboard {
|
|
|
156
160
|
/** 自定义功能按钮 */
|
|
157
161
|
get actionKeys() {
|
|
158
162
|
return [
|
|
159
|
-
new
|
|
160
|
-
new
|
|
163
|
+
new DKBtn({ label: '清零', fn: (_) => '' }),
|
|
164
|
+
new DKBtn({
|
|
161
165
|
label: '下一个',
|
|
162
166
|
className: 'm-bg-primary m-text-white',
|
|
163
167
|
fn: (value) => {
|
|
@@ -165,7 +169,7 @@ export class DigitalKeyboard {
|
|
|
165
169
|
return this.form[this.active]
|
|
166
170
|
},
|
|
167
171
|
}),
|
|
168
|
-
new
|
|
172
|
+
new DKBtn({
|
|
169
173
|
label: '确认',
|
|
170
174
|
flex: 2,
|
|
171
175
|
className: 'm-bg-primary m-text-white',
|
|
@@ -211,7 +215,7 @@ export class DigitalKeyboard {
|
|
|
211
215
|
disabledHeader: true,
|
|
212
216
|
disabledAnimate: false,
|
|
213
217
|
bottom: true,
|
|
214
|
-
children: this.
|
|
218
|
+
children: this.node,
|
|
215
219
|
})
|
|
216
220
|
mp && wx.hideKeyboard()
|
|
217
221
|
}
|
|
@@ -222,4 +226,4 @@ export class DigitalKeyboard {
|
|
|
222
226
|
}
|
|
223
227
|
export default DigitalKeyboard
|
|
224
228
|
|
|
225
|
-
export {
|
|
229
|
+
export { DKBtn } from './Btn'
|
|
@@ -3,7 +3,7 @@ import { Story } from '@storybook/react'
|
|
|
3
3
|
import { TextField } from '../text_field'
|
|
4
4
|
import { DigitalKeyboard, DigitalKeyboardProps } from '.'
|
|
5
5
|
import { Text } from '../text'
|
|
6
|
-
import {
|
|
6
|
+
import { DKBtn } from './Btn'
|
|
7
7
|
import { View } from '../view'
|
|
8
8
|
import { Toast } from '../toast'
|
|
9
9
|
import { Page } from '../page'
|
|
@@ -19,19 +19,17 @@ const Template: Story<DigitalKeyboardProps> = (args) => {
|
|
|
19
19
|
apple: '1.00',
|
|
20
20
|
peach: '0.50',
|
|
21
21
|
}
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
})
|
|
34
|
-
)
|
|
22
|
+
const keyboard = new DigitalKeyboard({
|
|
23
|
+
...args,
|
|
24
|
+
form: form,
|
|
25
|
+
active: '',
|
|
26
|
+
async onAction(btn) {
|
|
27
|
+
if (btn.label === '确认') {
|
|
28
|
+
console.log('result:', 'apple', keyboard.get('apple'))
|
|
29
|
+
keyboard.hide()
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
})
|
|
35
33
|
|
|
36
34
|
return (
|
|
37
35
|
<View style={{ height: '300px' }}>
|
|
@@ -60,7 +58,7 @@ const Template: Story<DigitalKeyboardProps> = (args) => {
|
|
|
60
58
|
export const Usage = Template.bind({})
|
|
61
59
|
Usage.argTypes = {
|
|
62
60
|
form: {
|
|
63
|
-
description: '`Object`
|
|
61
|
+
description: '`Object` 表单的字段键值对,可以通过.set增改,通过.get读取',
|
|
64
62
|
type: {
|
|
65
63
|
required: true,
|
|
66
64
|
},
|
|
@@ -122,13 +120,13 @@ Usage.argTypes = {
|
|
|
122
120
|
},
|
|
123
121
|
onInput: {
|
|
124
122
|
description:
|
|
125
|
-
'`(value: string | undefined, key:
|
|
123
|
+
'`(value: string | undefined, key: DKBtn) => void` 虚拟键盘的点击事件',
|
|
126
124
|
control: false,
|
|
127
125
|
type: {},
|
|
128
126
|
},
|
|
129
127
|
onAction: {
|
|
130
128
|
description:
|
|
131
|
-
'`(value: string | undefined, key:
|
|
129
|
+
'`(value: string | undefined, key: DKBtn) => void` 虚拟键盘的功能键(actionKeys)点击事件',
|
|
132
130
|
control: false,
|
|
133
131
|
type: {},
|
|
134
132
|
},
|
|
@@ -154,7 +152,7 @@ Usage.argTypes = {
|
|
|
154
152
|
name: 'function',
|
|
155
153
|
},
|
|
156
154
|
},
|
|
157
|
-
'.
|
|
155
|
+
'.node': {
|
|
158
156
|
description: '`ReactComponent` 键盘组件节点',
|
|
159
157
|
type: {
|
|
160
158
|
name: 'function',
|
|
@@ -210,12 +208,10 @@ export const CustomLayout = () => {
|
|
|
210
208
|
apple: '1.00',
|
|
211
209
|
peach: '0.50',
|
|
212
210
|
}
|
|
213
|
-
const
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
})
|
|
218
|
-
)
|
|
211
|
+
const keyboard = new DigitalKeyboard({
|
|
212
|
+
form: form,
|
|
213
|
+
active: '',
|
|
214
|
+
})
|
|
219
215
|
|
|
220
216
|
return (
|
|
221
217
|
<Page style={{ width: '100%' }}>
|
|
@@ -228,7 +224,7 @@ export const CustomLayout = () => {
|
|
|
228
224
|
头部
|
|
229
225
|
</Flex>
|
|
230
226
|
<View>显示在指定位置</View>
|
|
231
|
-
<View>{keyboard.
|
|
227
|
+
<View>{keyboard.node}</View>
|
|
232
228
|
<Flex
|
|
233
229
|
height='100px'
|
|
234
230
|
className='m-bg-accent m-margin-tb-10'
|
|
@@ -246,7 +242,7 @@ export const CustomActions = () => {
|
|
|
246
242
|
class Keyboard extends DigitalKeyboard {
|
|
247
243
|
get actionKeys() {
|
|
248
244
|
return [
|
|
249
|
-
new
|
|
245
|
+
new DKBtn({
|
|
250
246
|
className: 'm-bg-accent m-text-white',
|
|
251
247
|
label: '自定义',
|
|
252
248
|
fn: (value) => {
|
|
@@ -254,7 +250,7 @@ export const CustomActions = () => {
|
|
|
254
250
|
return '一键输入自定义内容'
|
|
255
251
|
},
|
|
256
252
|
}),
|
|
257
|
-
new
|
|
253
|
+
new DKBtn({
|
|
258
254
|
label: '确认',
|
|
259
255
|
flex: 3,
|
|
260
256
|
className: 'm-bg-primary m-text-white',
|
|
@@ -267,20 +263,18 @@ export const CustomActions = () => {
|
|
|
267
263
|
}
|
|
268
264
|
}
|
|
269
265
|
|
|
270
|
-
const
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
})
|
|
283
|
-
)
|
|
266
|
+
const keyboard = new Keyboard({
|
|
267
|
+
rewriteMode: true,
|
|
268
|
+
fractionDigits: 2,
|
|
269
|
+
min: 0,
|
|
270
|
+
max: 9999.99,
|
|
271
|
+
// 也可以通过这里自定义keys
|
|
272
|
+
// digitalKeys: [],
|
|
273
|
+
// actionKeys: [],
|
|
274
|
+
form: {
|
|
275
|
+
input: '',
|
|
276
|
+
},
|
|
277
|
+
})
|
|
284
278
|
return (
|
|
285
279
|
<View style={{ height: '300px' }}>
|
|
286
280
|
<TextField
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import React, { FC } from 'react'
|
|
2
|
+
import classNames from 'classnames'
|
|
3
|
+
import _ from 'lodash'
|
|
4
|
+
import { View } from '../view'
|
|
5
|
+
import { ErrorProps } from './types'
|
|
6
|
+
import { Text } from '../text'
|
|
7
|
+
|
|
8
|
+
export const Error: FC<ErrorProps> = ({ className, topLine, children }) => {
|
|
9
|
+
return children ? (
|
|
10
|
+
<View
|
|
11
|
+
className={classNames('error', className, {
|
|
12
|
+
'm-border-1px-top-before': topLine,
|
|
13
|
+
'has-error': !!children,
|
|
14
|
+
})}
|
|
15
|
+
>
|
|
16
|
+
<View className='error-message'>{children}</View>
|
|
17
|
+
</View>
|
|
18
|
+
) : (
|
|
19
|
+
<></>
|
|
20
|
+
)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export default Error
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as Error } from './error'
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
.error {
|
|
2
|
+
@red: fade(red, 50);
|
|
3
|
+
color: @red;
|
|
4
|
+
font-size: 10px;
|
|
5
|
+
width: 100%;
|
|
6
|
+
padding: 5px 0;
|
|
7
|
+
&.m-border-1px-top-before::before {
|
|
8
|
+
border-color: @red;
|
|
9
|
+
}
|
|
10
|
+
.error-message {
|
|
11
|
+
display: inline-block;
|
|
12
|
+
animation-name: headShake;
|
|
13
|
+
animation-timing-function: ease;
|
|
14
|
+
animation-duration: 0.75s;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
@keyframes headShake {
|
|
19
|
+
0% {
|
|
20
|
+
transform: translateX(0);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
6.5% {
|
|
24
|
+
transform: translateX(-6px) rotateY(-9deg);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
18.5% {
|
|
28
|
+
transform: translateX(5px) rotateY(7deg);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
31.5% {
|
|
32
|
+
transform: translateX(-3px) rotateY(-5deg);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
43.5% {
|
|
36
|
+
transform: translateX(2px) rotateY(3deg);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
50% {
|
|
40
|
+
transform: translateX(0);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -38,6 +38,8 @@ const PopupBase: FC<PopupProps> = ({
|
|
|
38
38
|
/** 动画有卡顿现象,先禁用 */
|
|
39
39
|
disabledAnimate = true,
|
|
40
40
|
children,
|
|
41
|
+
hasCustomTab = true,
|
|
42
|
+
disableBottomSafeArea,
|
|
41
43
|
...rest
|
|
42
44
|
}) => {
|
|
43
45
|
devWarnForHook(() => {
|
|
@@ -57,6 +59,7 @@ const PopupBase: FC<PopupProps> = ({
|
|
|
57
59
|
'm-animated-slide-in-left': left,
|
|
58
60
|
'm-animated-slide-in-right': right,
|
|
59
61
|
'm-animated-slide-in-bottom': bottom,
|
|
62
|
+
'm-bottom-safe-area': !disableBottomSafeArea,
|
|
60
63
|
},
|
|
61
64
|
className
|
|
62
65
|
)
|
|
@@ -90,7 +93,7 @@ const PopupBase: FC<PopupProps> = ({
|
|
|
90
93
|
</Flex>
|
|
91
94
|
)}
|
|
92
95
|
<View className='m-popup-content'>{children}</View>
|
|
93
|
-
<CustomTabbar />
|
|
96
|
+
{hasCustomTab && <CustomTabbar />}
|
|
94
97
|
</View>
|
|
95
98
|
</View>
|
|
96
99
|
)
|
|
@@ -51,6 +51,7 @@ const PopupBase: FC<PopupV1Props> = ({
|
|
|
51
51
|
titleClassName,
|
|
52
52
|
titleCenter,
|
|
53
53
|
clickMaskClose = true,
|
|
54
|
+
disableBottomSafeArea,
|
|
54
55
|
...rest
|
|
55
56
|
}) => {
|
|
56
57
|
devWarnForHook(() => {
|
|
@@ -128,7 +129,7 @@ const PopupBase: FC<PopupV1Props> = ({
|
|
|
128
129
|
</Flex>
|
|
129
130
|
)}
|
|
130
131
|
<View className='m-popup-content'>{children}</View>
|
|
131
|
-
<CustomTabbar />
|
|
132
|
+
{!disableBottomSafeArea && <CustomTabbar />}
|
|
132
133
|
</View>
|
|
133
134
|
</View>
|
|
134
135
|
)
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
|
|
66
66
|
@supports (bottom: constant(safe-area-inset-bottom)) or
|
|
67
67
|
(bottom: env(safe-area-inset-bottom)) {
|
|
68
|
-
.m-popup {
|
|
68
|
+
.m-popup.m-bottom-safe-area {
|
|
69
69
|
padding-bottom: constant(safe-area-inset-bottom); /* 兼容 iOS < 11.2 */
|
|
70
70
|
padding-bottom: env(safe-area-inset-bottom); /* 兼容 iOS >= 11.2 */
|
|
71
71
|
}
|
|
@@ -19,6 +19,10 @@ interface PopupProps extends HTMLAttributes<HTMLDivElement> {
|
|
|
19
19
|
disabledAnimate?: boolean
|
|
20
20
|
/** 内部用 */
|
|
21
21
|
isPickPopup?: boolean
|
|
22
|
+
/** 禁用下方安全边距,默认为false */
|
|
23
|
+
disableBottomSafeArea?: boolean
|
|
24
|
+
/** 预留底部自定义导航高度,默认为true */
|
|
25
|
+
hasCustomTab?: boolean
|
|
22
26
|
}
|
|
23
27
|
|
|
24
28
|
interface PopupStaticsTypes {
|
|
@@ -97,6 +97,11 @@ export class TextField extends Component<TextFieldProps, TextFieldState> {
|
|
|
97
97
|
const float = parseFloat(value.replace(/\D\./g, ''))
|
|
98
98
|
if (isNaN(float)) {
|
|
99
99
|
value = ''
|
|
100
|
+
} else if (value.endsWith('.0')) {
|
|
101
|
+
// 处理特殊情况
|
|
102
|
+
if (this.props.fractionDigits === 0) {
|
|
103
|
+
value = value.replace(/\.0$/, '')
|
|
104
|
+
}
|
|
100
105
|
} else {
|
|
101
106
|
value = clamp(
|
|
102
107
|
float,
|
|
@@ -159,7 +164,7 @@ export class TextField extends Component<TextFieldProps, TextFieldState> {
|
|
|
159
164
|
disabled,
|
|
160
165
|
highlight,
|
|
161
166
|
cursorSpacing = 30,
|
|
162
|
-
maxLength,
|
|
167
|
+
maxLength = -1,
|
|
163
168
|
confirmType,
|
|
164
169
|
adjustPosition,
|
|
165
170
|
block,
|
|
@@ -170,6 +175,7 @@ export class TextField extends Component<TextFieldProps, TextFieldState> {
|
|
|
170
175
|
onClick,
|
|
171
176
|
onConfirm,
|
|
172
177
|
fractionDigits,
|
|
178
|
+
alwaysEmbed = true,
|
|
173
179
|
...rest
|
|
174
180
|
// 注意,不用传给input或area的props要在此列出来,不然rest会带过去
|
|
175
181
|
} = this.props
|
|
@@ -179,7 +185,7 @@ export class TextField extends Component<TextFieldProps, TextFieldState> {
|
|
|
179
185
|
|
|
180
186
|
const common = {
|
|
181
187
|
disabled: disabled,
|
|
182
|
-
onInput: this.onInput.bind(this),
|
|
188
|
+
// onInput: this.onInput.bind(this),
|
|
183
189
|
onChange: this.onInput.bind(this),
|
|
184
190
|
onClick: this.onClick.bind(this),
|
|
185
191
|
onBlur: () => {
|
|
@@ -207,6 +213,7 @@ export class TextField extends Component<TextFieldProps, TextFieldState> {
|
|
|
207
213
|
focus,
|
|
208
214
|
password,
|
|
209
215
|
placeholderClass: 'text-field-placeholder',
|
|
216
|
+
alwaysEmbed: alwaysEmbed,
|
|
210
217
|
onConfirm,
|
|
211
218
|
})
|
|
212
219
|
} else {
|
|
@@ -224,6 +231,7 @@ export class TextField extends Component<TextFieldProps, TextFieldState> {
|
|
|
224
231
|
active: highlight || active,
|
|
225
232
|
highlight,
|
|
226
233
|
disabled,
|
|
234
|
+
block,
|
|
227
235
|
})}
|
|
228
236
|
width={width}
|
|
229
237
|
style={style}
|
|
@@ -300,7 +308,9 @@ export class TextField extends Component<TextFieldProps, TextFieldState> {
|
|
|
300
308
|
</Flex>
|
|
301
309
|
)}
|
|
302
310
|
<View
|
|
303
|
-
className={classNames('text-field-error-message', errClassName
|
|
311
|
+
className={classNames('text-field-error-message', errClassName, {
|
|
312
|
+
'has-error': err,
|
|
313
|
+
})}
|
|
304
314
|
>
|
|
305
315
|
{err}
|
|
306
316
|
</View>
|
|
@@ -7,7 +7,7 @@ interface TextFieldProps
|
|
|
7
7
|
'style' | 'onBlur' | 'onFocus' | 'onClick' | 'onChange' | 'type'
|
|
8
8
|
> {
|
|
9
9
|
value: string
|
|
10
|
-
/** 输入事件, e在web中为ChangeEvent,在小程序中为onInputEventDetail */
|
|
10
|
+
/** 输入事件, e在web中为ChangeEvent(value为e.target.value),在小程序中为onInputEventDetail(value为e.detail.value) */
|
|
11
11
|
onChange?: (e: any) => void
|
|
12
12
|
/** 输入框类型, web端和小程序端取值有差异 */
|
|
13
13
|
type?: InputProps['type']
|
package/src/index.less
CHANGED
|
@@ -37,11 +37,13 @@
|
|
|
37
37
|
@import './component/picker/style.less';
|
|
38
38
|
@import './component/nav/style.less';
|
|
39
39
|
@import './component/date_selector/style.less';
|
|
40
|
-
@import './component
|
|
40
|
+
@import './component/text_field/style.less';
|
|
41
|
+
@import './component/error/style.less';
|
|
41
42
|
|
|
42
43
|
// 公共
|
|
43
44
|
@import './less/mixin';
|
|
44
45
|
@import './less/base';
|
|
46
|
+
@import './less/button';
|
|
45
47
|
@import './less/distance';
|
|
46
48
|
@import './less/bg';
|
|
47
49
|
@import './less/display';
|
|
@@ -51,7 +53,6 @@
|
|
|
51
53
|
@import './less/border';
|
|
52
54
|
@import './less/animation';
|
|
53
55
|
@import './less/shadow';
|
|
54
|
-
@import './less/btn';
|
|
55
56
|
@import './less/ellipsis';
|
|
56
57
|
@import './less/lineheight';
|
|
57
|
-
@import './less/opacity';
|
|
58
|
+
@import './less/opacity';
|
package/src/index.ts
CHANGED
package/src/less/animation.less
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
.m-animated {
|
|
2
|
-
animation-duration: 0.2s;
|
|
3
|
-
animation-fill-mode: none;
|
|
2
|
+
// animation-duration: 0.2s;
|
|
3
|
+
// animation-fill-mode: none;
|
|
4
|
+
transition: all 0.2s;
|
|
4
5
|
}
|
|
5
6
|
|
|
6
7
|
.m-animated-fade-in {
|
|
@@ -153,10 +154,14 @@
|
|
|
153
154
|
|
|
154
155
|
@keyframes slide-in-bottom {
|
|
155
156
|
from {
|
|
156
|
-
transform: translate3d(0, 100%, 0);
|
|
157
|
+
// transform: translate3d(0, 100%, 0);
|
|
158
|
+
max-height: 0%;
|
|
159
|
+
overflow: hidden;
|
|
157
160
|
}
|
|
158
161
|
|
|
159
162
|
to {
|
|
160
|
-
transform: translate3d(0, 0, 0);
|
|
163
|
+
// transform: translate3d(0, 0, 0);
|
|
164
|
+
max-height: 100%;
|
|
165
|
+
overflow: hidden;
|
|
161
166
|
}
|
|
162
167
|
}
|
package/src/less/bg.less
CHANGED
|
@@ -26,6 +26,10 @@
|
|
|
26
26
|
background: var(--m-color-bg-accent-light) !important;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
+
.m-bg-transparent {
|
|
30
|
+
background: transparent !important;
|
|
31
|
+
}
|
|
32
|
+
|
|
29
33
|
.m-bg-white-active-with {
|
|
30
34
|
.mBgWhiteActiveWith();
|
|
31
35
|
}
|
|
@@ -61,4 +65,7 @@ each(@colors,.(@color,@colorKey,@index){
|
|
|
61
65
|
.generate-colors(@opacity+1);
|
|
62
66
|
}
|
|
63
67
|
.generate-colors(0);
|
|
68
|
+
.m-bg-@{colorKey}{
|
|
69
|
+
background-color: @color!important;
|
|
70
|
+
}
|
|
64
71
|
});
|
package/src/less/border.less
CHANGED
|
@@ -98,13 +98,22 @@
|
|
|
98
98
|
}
|
|
99
99
|
|
|
100
100
|
.m-border-radius-circle {
|
|
101
|
-
border-radius: 50
|
|
101
|
+
border-radius: 50% !important;
|
|
102
102
|
}
|
|
103
103
|
|
|
104
104
|
.m-border-radius-chip {
|
|
105
|
-
border-radius: 100px;
|
|
105
|
+
border-radius: 100px !important;
|
|
106
106
|
}
|
|
107
107
|
|
|
108
108
|
.m-border-radius-5 {
|
|
109
|
-
border-radius: 5px;
|
|
109
|
+
border-radius: 5px !important;
|
|
110
110
|
}
|
|
111
|
+
|
|
112
|
+
// 生成圆角, .m-border-radius-{1-10}
|
|
113
|
+
.generate-size(@size) when (@size<=10) {
|
|
114
|
+
.m-border-radius-@{size} {
|
|
115
|
+
border-radius: @size * 1px;
|
|
116
|
+
}
|
|
117
|
+
.generate-size(@size + 1);
|
|
118
|
+
}
|
|
119
|
+
.generate-size(0);
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
padding: 0 10px;
|
|
47
47
|
border-radius: 3px;
|
|
48
48
|
box-sizing: border-box;
|
|
49
|
-
line-height:
|
|
49
|
+
line-height: 2;
|
|
50
50
|
min-height: @button-normal;
|
|
51
51
|
cursor: pointer;
|
|
52
52
|
user-select: none;
|
|
@@ -68,6 +68,7 @@
|
|
|
68
68
|
}
|
|
69
69
|
.m-button {
|
|
70
70
|
.m-button-text();
|
|
71
|
+
line-height: 1;
|
|
71
72
|
background-color: @button-with-white-text[default];
|
|
72
73
|
}
|
|
73
74
|
|
|
@@ -112,6 +113,7 @@ each(@button-with-black-text,.(@value,@key,@index){
|
|
|
112
113
|
|
|
113
114
|
.m-button-icon {
|
|
114
115
|
.m-button-text();
|
|
116
|
+
line-height: 1;
|
|
115
117
|
min-width: @button-normal;
|
|
116
118
|
padding: 10px;
|
|
117
119
|
border-radius: 50%;
|
package/src/less/distance.less
CHANGED
package/src/less/text.less
CHANGED
|
@@ -1,27 +1,3 @@
|
|
|
1
|
-
.m-text-20 {
|
|
2
|
-
font-size: var(--m-size-text-20) !important;
|
|
3
|
-
}
|
|
4
|
-
|
|
5
|
-
.m-text-18 {
|
|
6
|
-
font-size: var(--m-size-text-18) !important;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
.m-text-16 {
|
|
10
|
-
font-size: var(--m-size-text-16) !important;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
.m-text-14 {
|
|
14
|
-
font-size: var(--m-size-text-14) !important;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
.m-text-12 {
|
|
18
|
-
font-size: var(--m-size-text-12) !important;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
.m-text-10 {
|
|
22
|
-
font-size: var(--m-size-text-10) !important;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
1
|
.m-text-center {
|
|
26
2
|
text-align: center !important;
|
|
27
3
|
}
|
|
@@ -90,6 +66,10 @@
|
|
|
90
66
|
text-decoration: line-through;
|
|
91
67
|
}
|
|
92
68
|
|
|
69
|
+
.m-text-normal {
|
|
70
|
+
font-weight: normal;
|
|
71
|
+
}
|
|
72
|
+
|
|
93
73
|
.m-text-bold {
|
|
94
74
|
font-weight: bold;
|
|
95
75
|
}
|
|
@@ -123,4 +103,20 @@ each(@colors,.(@color,@colorKey,@index){
|
|
|
123
103
|
.generate-colors(@opacity+1);
|
|
124
104
|
}
|
|
125
105
|
.generate-colors(0);
|
|
106
|
+
.m-text-@{colorKey}{
|
|
107
|
+
color: @color!important;
|
|
108
|
+
}
|
|
126
109
|
});
|
|
110
|
+
|
|
111
|
+
// 生成size, .m-text-{8-32}, --m-size-text-{8-32}
|
|
112
|
+
.generate-size(@size) when (@size<=32) {
|
|
113
|
+
:root,
|
|
114
|
+
page {
|
|
115
|
+
--m-size-text-@{size}: ~'@{size}px';
|
|
116
|
+
}
|
|
117
|
+
.m-text-@{size} {
|
|
118
|
+
font-size: e(%('var(--m-size-text-%s)!important', @size));
|
|
119
|
+
}
|
|
120
|
+
.generate-size(@size + 2);
|
|
121
|
+
}
|
|
122
|
+
.generate-size(8);
|
package/src/less/variable.less
CHANGED
|
@@ -91,14 +91,6 @@ page {
|
|
|
91
91
|
// 非颜色
|
|
92
92
|
:root,
|
|
93
93
|
page {
|
|
94
|
-
// 字体尺寸
|
|
95
|
-
--m-size-text-10: 10px;
|
|
96
|
-
--m-size-text-12: 12px;
|
|
97
|
-
--m-size-text-14: 14px;
|
|
98
|
-
--m-size-text-16: 16px;
|
|
99
|
-
--m-size-text-18: 18px;
|
|
100
|
-
--m-size-text-20: 20px;
|
|
101
|
-
|
|
102
94
|
// line-height
|
|
103
95
|
--m-size-line-height: 1.6;
|
|
104
96
|
|