提交 efaab944 编写于 作者: fxy060608's avatar fxy060608

Merge branch 'dev' of https://github.com/dcloudio/uni-app into dev-mp-welink

......@@ -2,7 +2,7 @@ const path = require('path')
const moduleAlias = require('module-alias')
moduleAlias.addAlias('../service', (fromPath, request, alias) => {
// @hap-toolkit/packager/lib/router/routes/index.js
if (fromPath.indexOf('/@hap-toolkit') !== -1 && fromPath.indexOf('packager') !== -1) {
if (fromPath.indexOf('@hap-toolkit') !== -1 && fromPath.indexOf('packager') !== -1) {
return path.resolve(__dirname, 'service.js')
}
return path.join(fromPath, '..', request)
......
......@@ -79,10 +79,10 @@ describe('codegen', () => {
assertCodegen(
`<div :id="'a'+b">A{{ d | e | f }}B{{text}}C</div>`,
`with(this){return _c('div',{attrs:{"id":_$s(0,'a-id','a'+b),"_i":0}},[_v((_$s(0,'t0-0',_s(_f("f")(_f("e")(d)))))+(_$s(0,'t0-1',_s(text))))])}`
)
assertCodegen(
`<view>{{obj.param1}}123123{{obj.param1}}123123{{obj.param1}}<text> -{{obj.param3}}---{{obj.param3}} </text>{{obj.param2}}aaaa{{obj.param2}}aaaa{{obj.param2}}</view>`,
`with(this){return _c('view',[_v((_$s(0,'t0-0',_s(obj.param1)))+(_$s(0,'t0-1',_s(obj.param1)))+(_$s(0,'t0-2',_s(obj.param1)))),_c('text',[_v((_$s(1,'t0-0',_s(obj.param3)))+(_$s(1,'t0-1',_s(obj.param3))))]),_v((_$s(0,'t2-0',_s(obj.param2)))+(_$s(0,'t2-1',_s(obj.param2)))+(_$s(0,'t2-2',_s(obj.param2))))])}`
)
assertCodegen(
`<view>{{obj.param1}}123123{{obj.param1}}123123{{obj.param1}}<text> -{{obj.param3}}---{{obj.param3}} </text>{{obj.param2}}aaaa{{obj.param2}}aaaa{{obj.param2}}</view>`,
`with(this){return _c('view',[_v((_$s(0,'t0-0',_s(obj.param1)))+(_$s(0,'t0-1',_s(obj.param1)))+(_$s(0,'t0-2',_s(obj.param1)))),_c('text',[_v((_$s(1,'t0-0',_s(obj.param3)))+(_$s(1,'t0-1',_s(obj.param3))))]),_v((_$s(0,'t2-0',_s(obj.param2)))+(_$s(0,'t2-1',_s(obj.param2)))+(_$s(0,'t2-2',_s(obj.param2))))])}`
)
})
......@@ -140,25 +140,48 @@ describe('codegen', () => {
'<view data-a="1" :data-b="b"></view>',
`with(this){return _c('view',{attrs:{"data-b":_$s(0,'a-data-b',b),"_i":0}})}`
)
})
it('generate v-if directive', () => {
assertCodegen(
'<text v-if="a">1</text><text v-else-if="b">2</text><text v-else-if="c">3</text><text v-else>d</text>',
`with(this){return (_$s(0,'i',a))?_c('text'):(_$s(1,'e',b))?_c('text'):(_$s(2,'e',c))?_c('text'):_c('text')}`
)
})
it('generate dynamic slot', () => {
assertCodegen(
'<base-layout><template v-slot:[dynamicSlotName]></template></base-layout>',
`with(this){return _c('base-layout',{attrs:{"_i":0},scopedSlots:_u([{key:_$s(1,'st',dynamicSlotName),fn:function(_empty_, _svm, _si){return undefined}}],null,true)})}`
)
})
it('generate ref', () => {
assertCodegen(
'<p :ref="component1"></p>',
`with(this){return _c('p',{ref:_$s(0,'ref',component1)})}`
)
})
})
it('generate v-if directive', () => {
assertCodegen(
'<text v-if="a">1</text><text v-else-if="b">2</text><text v-else-if="c">3</text><text v-else>d</text>',
`with(this){return (_$s(0,'i',a))?_c('text'):(_$s(1,'e',b))?_c('text'):(_$s(2,'e',c))?_c('text'):_c('text')}`
)
})
it('generate dynamic slot', () => {
assertCodegen(
'<base-layout><template v-slot:[dynamicSlotName]></template></base-layout>',
`with(this){return _c('base-layout',{attrs:{"_i":0},scopedSlots:_u([{key:_$s(1,'st',dynamicSlotName),fn:function(_empty_, _svm, _si){return undefined}}],null,true)})}`
)
})
it('generate ref', () => {
assertCodegen(
'<p :ref="component1"></p>',
`with(this){return _c('p',{ref:_$s(0,'ref',component1)})}`
)
})
it('generate image', () => {
assertCodegen(
'<image :src="src"/>',
`with(this){return _c('image',{attrs:{"src":_$s(0,'a-src',src),"_i":0}})}`
)
assertCodegen(
'<image src="/static/logo.png"/>',
`with(this){return _c('image',{attrs:{"_i":0}})}`
)
assertCodegen(
'<image src="../static/logo.png"/>',
`with(this){return _c('image',{attrs:{"src":_$s(0,'a-src',"/"+require("../static/logo.png")),"_i":0}})}`
)
assertCodegen(
'<image src="@/static/logo.png"/>',
`with(this){return _c('image',{attrs:{"_i":0}})}`
)
assertCodegen(
'<image src="~@/static/logo.png"/>',
`with(this){return _c('image',{attrs:{"_i":0}})}`
)
})
})
/* eslint-enable quotes */
......@@ -40,12 +40,12 @@ describe('codegen', () => {
'<div><slot><div>{{hi}}</div></slot></div>',
`with(this){return _c('div',{attrs:{"_i":0}},[_t("default",[_c('div',{attrs:{"_i":2}},[_v((_$g(2,'t0-0')))])],{"_i":1})],2)}`
)
})
it('generate text with multiple statements', () => {
assertCodegen(
`<view>{{obj.param1}}123123{{obj.param1}}123123{{obj.param1}}<text> -{{obj.param3}}---{{obj.param3}} </text>{{obj.param2}}aaaa{{obj.param2}}aaaa{{obj.param2}}</view>`,
`with(this){return _c('v-uni-view',{attrs:{"_i":0}},[_v((_$g(0,'t0-0'))+"123123"+(_$g(0,'t0-1'))+"123123"+(_$g(0,'t0-2'))),_c('v-uni-text',{attrs:{"_i":1}},[_v("-"+(_$g(1,'t0-0'))+"---"+(_$g(1,'t0-1')))]),_v((_$g(0,'t2-0'))+"aaaa"+(_$g(0,'t2-1'))+"aaaa"+(_$g(0,'t2-2')))],1)}`
)
})
it('generate text with multiple statements', () => {
assertCodegen(
`<view>{{obj.param1}}123123{{obj.param1}}123123{{obj.param1}}<text> -{{obj.param3}}---{{obj.param3}} </text>{{obj.param2}}aaaa{{obj.param2}}aaaa{{obj.param2}}</view>`,
`with(this){return _c('v-uni-view',{attrs:{"_i":0}},[_v((_$g(0,'t0-0'))+"123123"+(_$g(0,'t0-1'))+"123123"+(_$g(0,'t0-2'))),_c('v-uni-text',{attrs:{"_i":1}},[_v("-"+(_$g(1,'t0-0'))+"---"+(_$g(1,'t0-1')))]),_v((_$g(0,'t2-0'))+"aaaa"+(_$g(0,'t2-1'))+"aaaa"+(_$g(0,'t2-2')))],1)}`
)
})
it('generate v-slot', () => {
assertCodegen(
......@@ -81,24 +81,46 @@ describe('codegen', () => {
'<view data-a="1" :data-b="b"></view>',
`with(this){return _c('v-uni-view',{attrs:{"data-a":"1","data-b":_$g(0,'a-data-b'),"_i":0}})}`
)
})
it('generate v-if directive', () => {
assertCodegen(
'<text v-if="a">1</text><text v-else-if="b">2</text><text v-else-if="c">3</text><text v-else>d</text>',
`with(this){return (_$g(0,'i'))?_c('v-uni-text',{attrs:{"_i":0}},[_v("1")]):(_$g(1,'e'))?_c('v-uni-text',{attrs:{"_i":1}},[_v("2")]):(_$g(2,'e'))?_c('v-uni-text',{attrs:{"_i":2}},[_v("3")]):_c('v-uni-text',{attrs:{"_i":3}},[_v("d")])}`
)
})
it('generate dynamic slot', () => {
assertCodegen(
'<base-layout><template v-slot:[dynamicSlotName]></template></base-layout>',
`with(this){return _c('base-layout',{attrs:{"_i":0},scopedSlots:_u([{key:_$g(1,'st'),fn:function(_empty_, _svm, _si){return undefined}}],null,true)})}`
)
})
it('generate ref', () => {
assertCodegen(
'<p :ref="component1"></p>',
`with(this){return _c('p',{ref:_$g(0,'ref'),attrs:{"_i":0}})}`
)
})
it('generate v-if directive', () => {
assertCodegen(
'<text v-if="a">1</text><text v-else-if="b">2</text><text v-else-if="c">3</text><text v-else>d</text>',
`with(this){return (_$g(0,'i'))?_c('v-uni-text',{attrs:{"_i":0}},[_v("1")]):(_$g(1,'e'))?_c('v-uni-text',{attrs:{"_i":1}},[_v("2")]):(_$g(2,'e'))?_c('v-uni-text',{attrs:{"_i":2}},[_v("3")]):_c('v-uni-text',{attrs:{"_i":3}},[_v("d")])}`
)
})
it('generate dynamic slot', () => {
assertCodegen(
'<base-layout><template v-slot:[dynamicSlotName]></template></base-layout>',
`with(this){return _c('base-layout',{attrs:{"_i":0},scopedSlots:_u([{key:_$g(1,'st'),fn:function(_empty_, _svm, _si){return undefined}}],null,true)})}`
)
})
it('generate ref', () => {
assertCodegen(
'<p :ref="component1"></p>',
`with(this){return _c('p',{ref:_$g(0,'ref'),attrs:{"_i":0}})}`
)
})
it('generate image', () => {
assertCodegen(
'<image :src="src"/>',
`with(this){return _c('v-uni-image',{attrs:{"src":_$g(0,'a-src'),"_i":0}})}`
)
assertCodegen(
'<image src="/static/logo.png"/>',
`with(this){return _c('v-uni-image',{attrs:{"src":"/static/logo.png","_i":0}})}`
)
assertCodegen(
'<image src="../static/logo.png"/>',
`with(this){return _c('v-uni-image',{attrs:{"src":_$g(0,'a-src'),"_i":0}})}`
)
assertCodegen(
'<image src="@/static/logo.png"/>',
`with(this){return _c('v-uni-image',{attrs:{"src":"/static/logo.png","_i":0}})}`
)
assertCodegen(
'<image src="~@/static/logo.png"/>',
`with(this){return _c('v-uni-image',{attrs:{"src":"/static/logo.png","_i":0}})}`
)
})
})
/* eslint-enable quotes */
const url = require('url')
const transformAssetUrls = {
'audio': 'src',
'video': ['src', 'poster'],
......@@ -14,7 +16,47 @@ const transformAssetUrls = {
'u-video': ['src', 'poster']
}
function rewrite (attr, name) {
function urlToRequire (url) {
const returnValue = `"${url}"`
// same logic as in transform-require.js
const firstChar = url.charAt(0)
if (firstChar === '.' || firstChar === '~' || firstChar === '@') {
if (firstChar === '~') {
const secondChar = url.charAt(1)
url = url.slice(secondChar === '/' ? 2 : 1)
}
const uriParts = parseUriParts(url)
if (!uriParts.hash) { // fixed by xxxxxx (v3 template中需要加/)
return `"/"+require("${url}")`
} else { // fixed by xxxxxx (v3 template中需要加/)
// support uri fragment case by excluding it from
// the require and instead appending it as string;
// assuming that the path part is sufficient according to
// the above caseing(t.i. no protocol-auth-host parts expected)
return `"/"+require("${uriParts.path}") + "${uriParts.hash}"`
}
}
return returnValue
}
/**
* vuejs/component-compiler-utils#22 Support uri fragment in transformed require
* @param urlString an url as a string
*/
function parseUriParts (urlString) {
// initialize return value
const returnValue = url.parse('')
if (urlString) {
// A TypeError is thrown if urlString is not a string
// @see https://nodejs.org/api/url.html#url_url_parse_urlstring_parsequerystring_slashesdenotehost
if (typeof urlString === 'string') {
// check is an uri
return url.parse(urlString) // take apart the uri
}
}
return returnValue
}
function rewrite (attr, name, options) {
if (attr.name === name) {
const value = attr.value
// only transform static URLs
......@@ -22,13 +64,17 @@ function rewrite (attr, name) {
attr.value = attr.value
.replace('"@/', '"/')
.replace('"~@/', '"/')
if (options.service || options.view) { // v3
attr.value = urlToRequire(attr.value.slice(1, -1))
}
return true
}
}
return false
}
module.exports = {
postTransformNode: (node) => {
postTransformNode: (node, options) => {
if (!node.attrs) {
return
}
......@@ -37,9 +83,19 @@ module.exports = {
return
}
if (typeof attributes === 'string') {
node.attrs.some(attr => rewrite(attr, attributes))
if (node.attrs.some(attr => rewrite(attr, attributes, options))) {
if (options.service || options.view) {
node.hasBindings = true
}
}
} else if (Array.isArray(attributes)) {
attributes.forEach(item => node.attrs.some(attr => rewrite(attr, item)))
attributes.forEach(item => {
if (node.attrs.some(attr => rewrite(attr, item, options))) {
if (options.service || options.view) {
node.hasBindings = true
}
}
})
}
}
}
......@@ -61,7 +61,7 @@ function generateAutoComponentsCode (autoComponents, dynamic = false) {
source
}) => {
if (dynamic) {
components.push(`'${name}': ()=>import(/* webpackChunkName: "${getWebpackChunkName(source)}" */'${source}')`)
components.push(`'${name}': function(){return import(/* webpackChunkName: "${getWebpackChunkName(source)}" */'${source}')}`)
} else {
components.push(`'${name}': require('${source}').default`)
}
......
......@@ -157,7 +157,7 @@ const rules = [{
}
].concat(cssLoaders)
if (process.env.UNI_USING_NVUE_COMPILER) {
if (process.env.UNI_USING_NVUE_COMPILER || process.env.UNI_USING_V3_NATIVE) {
rules.unshift({
resourceQuery: function (query) {
return query.indexOf('vue&type=template') !== -1 && query.indexOf('mpType=page') !== -1
......
......@@ -48,11 +48,18 @@ module.exports = function(content) {
}
// 暂时实时读取配置信息,查找是否 disableScroll
const appJson = getPagesJson()
if (!appJson.nvue || !appJson.nvue.pages) {
return content
let pageJson
if (appJson.nvue) { //旧版本
if (!appJson.nvue || !appJson.nvue.pages) {
return content
}
const pagePath = resourcePath + '.html'
pageJson = appJson.nvue.pages.find(page => page.path === pagePath)
} else {
pageJson = appJson.pages.find(page => page.path === resourcePath)
}
const pagePath = resourcePath + '.html'
const pageJson = appJson.nvue.pages.find(page => page.path === pagePath)
if (!pageJson) {
return content
}
......
......@@ -373,7 +373,11 @@ module.exports = function (pagesJson, userManifestJson) {
manifestJson.plus['uni-app'].control = control
manifestJson.plus['uni-app'].nvueCompiler = appJson.nvueCompiler
manifestJson.plus['uni-app'].renderer = appJson.renderer
// v3 + native 时强制 auto
manifestJson.plus['uni-app'].renderer = process.env.UNI_USING_V3_NATIVE
? 'auto'
: appJson.renderer
if (flexDir) {
manifestJson.plus['uni-app'].nvue = {
'flex-direction': flexDir
......
......@@ -16,7 +16,7 @@ const TASK_APIS = ['request', 'downloadFile', 'uploadFile', 'connectSocket']
const ASYNC_API = ['createBLEConnection']
const CALLBACK_API_RE = /^on/
const CALLBACK_API_RE = /^on|^off/
export function isContextApi (name) {
return CONTEXT_API_RE.test(name)
......
......@@ -27,7 +27,7 @@
:disabled="disabled"
:maxlength="maxlengthNumber"
:autofocus="autoFocus"
:class="{'uni-textarea-textarea-ios': isIOS}"
:class="{'uni-textarea-textarea-fix-margin': fixMargin}"
:style="{'overflow-y': autoHeight? 'hidden':'auto'}"
class="uni-textarea-textarea"
@compositionstart="_compositionstart"
......@@ -45,6 +45,7 @@ import {
emitter,
keyboard
} from 'uni-mixins'
const DARK_TEST_STRING = '(prefers-color-scheme: dark)'
export default {
name: 'Textarea',
mixins: [emitter, keyboard],
......@@ -114,7 +115,8 @@ export default {
focusSync: this.focus,
height: 0,
focusChangeSource: '',
isIOS: String(navigator.platform).indexOf('iP') === 0 && String(navigator.vendor).indexOf('Apple') === 0 && String(navigator.appVersion).split('OS ')[1].split('_')[0] < 13
// iOS 13 以下版本需要修正边距
fixMargin: String(navigator.platform).indexOf('iP') === 0 && String(navigator.vendor).indexOf('Apple') === 0 && window.matchMedia(DARK_TEST_STRING).media !== DARK_TEST_STRING
}
},
computed: {
......@@ -357,7 +359,7 @@ uni-textarea[hidden] {
text-shadow: inherit;
}
/* 用于解决 iOS textarea 内部默认边距 */
.uni-textarea-textarea-ios {
.uni-textarea-textarea-fix-margin {
width: auto;
right: 0;
margin: 0 -3px;
......
......@@ -156,7 +156,7 @@ export function getStatusbarHeight () {
}
export function getScreenInfo () {
const { resolutionWidth, resolutionHeight } = plus.screen.getCureentSize()
const { resolutionWidth, resolutionHeight } = plus.screen.getCurrentSize()
return {
screenWidth: Math.round(resolutionWidth),
screenHeight: Math.round(resolutionHeight)
......
......@@ -7,13 +7,19 @@
2.打开快应用调试器,下载平台(快应用预览版:版本号1060)
3.安装 openssl(windows系统)
#### 搭建
1.创建 `hello uni-app` 工程
1.创建 `hello uni-app` 测试工程
```
vue create -p dcloudio/uni-preset-vue#alpha my-qa-project -n
```
目前手动安装依赖库: 根目录执行
```
yarn add @dcloudio/uni-quickapp@alpha -D
```
2.生成证书 `certificate.pem``private.pem`:到目录 `src/sign/debug/`
```
......@@ -37,32 +43,55 @@ npm run serve:quickapp
#### 开发调试代码
1.仓库 `uni-app(quickapp branch)` [https://github.com/dcloudio/uni-app/tree/quickapp](https://github.com/dcloudio/uni-app/tree/quickapp)
1.Fork 仓库 `uni-app` [https://github.com/dcloudio/uni-app](https://github.com/dcloudio/uni-app),切换到 dev 分支
2.编译 (输出目录`packages/uni-quickapp`)
2.目录说明:
```
`src/platforms/quickapp/service/api` 平台的接口实现(方案同h5,app-plus)
`src/platforms/quickapp/view/components` 平台的组件实现(easycom格式,目录名与文件名一致)
`packages/uni-quickapp/lib/compiler-module` 编译阶段标签转换之类逻辑
`packages/uni-quickapp/lib/polyfill.css` 全局样式差异代码
`packages/uni-quickapp/lib/manifest` manifest.json的生成逻辑
npm run build:quickapp
```
3.编译 (输出目录`packages/uni-quickapp`)
3.手动替换编译输出目录 `packages/uni-quickapp` 到测试工程 `node_modules/@dcloudio/uni-quickapp`,也可以考虑自己npm link本地`uni-quickapp`包(需要考虑三方依赖)
4.使用 pull request 提交代码
#### `uni-app` 目录说明
```
npm run build:quickapp
packages
├─uni-quickapp
│ └─lib
│ ├─compiler-module (编译阶段标签转换之类逻辑)
│ ├─polyfill.css (全局样式差异代码)
│ └─manifest (manifest.json的生成逻辑)
src
├─platforms
│ └─quickapp
│ ├─...
│ ├─service
│ │ └─api 平台的接口实现(方案同h5,app-plus)
│ └─view
│ └─components 平台的组件实现(easycom格式,目录名与文件名一致)
│ └─button
```
4.可以选择手动替换到自己测试工程的`@dcloudio/uni-quickapp`里边,也可以考虑自己npm link本地`uni-quickapp`包(需要考虑三方依赖)
#### 开发示例
- button 组件 [https://github.com/dcloudio/uni-app/tree/master/src/platforms/quickapp/view/components/button](https://github.com/dcloudio/uni-app/tree/master/src/platforms/quickapp/view/components/button)
#### 包名配置
```
项目 manifest.json
{
"quickapp" : {
"package": "com.example.demo"
"quickapp" : {
"config": {
"package": "com.example.demo",
"designWidth": 360
}
}
}
```
......
<template>
<div v-on="$listeners">
<text>
<div
:class="viewClass"
class="uni-button"
v-on="$listeners">
<text
:class="textClass"
class="uni-button-t">
<slot />
</text>
</div>
</template>
<script>
<script>
const BUTTON_TYPES = {
default: 'd',
primary: 'p',
warn: 'w'
}
export default {
name: 'Button'
name: 'Button',
props: {
hoverClass: {
type: String,
default: 'button-hover'
},
disabled: {
type: [Boolean, String],
default: false
},
id: {
type: String,
default: ''
},
type: {
type: String,
default: 'default'
},
size: {
type: String,
default: 'default'
},
plain: {
type: [Boolean, String],
default: false
},
loading: {
type: [Boolean, String],
default: false
},
hoverStopPropagation: {
type: Boolean,
default: false
},
hoverStartTime: {
type: Number,
default: 20
},
hoverStayTime: {
type: Number,
default: 70
},
openType: {
type: String,
default: ''
},
formType: {
type: String,
default: '',
validator: function validator (value) {
return ~['', 'submit', 'reset'].indexOf(value)
}
}
},
computed: {
viewClass () {
return this._getClass('')
},
textClass () {
return this._getClass('-t')
}
},
methods: {
_onClick ($event, isLabelClick) {
if (this.disabled) {
return
}
if (isLabelClick) {
this.$el.click()
}
if (this.formType) {
this.$dispatch('Form', this.formType === 'submit' ? 'uni-form-submit' : 'uni-form-reset', {
type: this.formType
}, this)
}
},
_getClass (t) {
let cl = 'uni-button-' + BUTTON_TYPES[this.type] + t
if (this.disabled) {
cl += '-d'
}
if (this.plain) {
cl += '-plain'
}
if (t === '-t' && this.size === 'mini') {
cl += ' uni-button-mini'
}
return cl
},
_getHoverClass (t) {
if (this.disabled) {
return ''
}
let cl = 'uni-button-' + BUTTON_TYPES[this.type] + t + '-hover'
if (this.plain) {
cl += '-plain'
}
return cl
}
}
}
</script>
<style>
<style>
.uni-button {
flex-direction: row;
align-items: center;
justify-content: center;
position: relative;
padding-left: 5px;
padding-right: 5px;
overflow: hidden;
color: #000000;
background-color: #f8f8f8;
border-radius: 5px;
border-style: solid;
border-width: 1px;
border-color: #dbdbdb;
}
.uni-button-t {
color: #000000;
font-size: 18px;
text-decoration: none;
line-height: 46px;
}
.uni-button-d {
background-color: #f8f8f8;
}
.uni-button-p {
background-color: #007aff;
border-color: #0062cc;
}
.uni-button-w {
background-color: #e64340;
border-color: #b83633;
}
.uni-button-d-t {
color: #000000;
}
.uni-button-p-t {
color: #ffffff;
}
.uni-button-w-t {
color: #ffffff;
}
.uni-button-d-d {
background-color: #f7f7f7;
}
.uni-button-p-d {
background-color: #63acfc;
border-color: #4f8aca;
}
.uni-button-w-d {
background-color: #ec8b89;
border-color: #bd6f6e;
}
.uni-button-d-t-d {
color: #cccccc;
}
.uni-button-p-t-d {
color: rgba(255,255,255,0.6);
}
.uni-button-w-t-d {
color: rgba(255,255,255,0.6);
}
.uni-button-d-plain {
border-color: #353535;
background-color: rgba(0,0,0,0);
}
.uni-button-p-plain {
border-color: #007aff;
background-color: rgba(0,0,0,0);
}
.uni-button-w-plain {
border-color: #e64340;
background-color: rgba(0,0,0,0);
}
.uni-button-d-t-plain {
color: #353535;
}
.uni-button-p-t-plain {
color: #007aff;
}
.uni-button-w-t-plain {
color: #e64340;
}
.uni-button-d-d-plain {
border-color: #c6c6c6;
background-color: rgba(0,0,0,0);
}
.uni-button-p-d-plain {
border-color: #c6c6c6;
background-color: rgba(0,0,0,0);
}
.uni-button-w-d-plain {
border-color: #c6c6c6;
background-color: rgba(0,0,0,0);
}
.uni-button-d-t-d-plain {
color: rgba(0,0,0,0.2);
}
.uni-button-p-t-d-plain {
color: rgba(0,0,0,0.2);
}
.uni-button-w-t-d-plain {
color: rgba(0,0,0,0.2);
}
.uni-button-mini {
line-height: 30px;
font-size: 13px;
padding-top: 0;
padding-right: 17.5px;
padding-bottom: 0;
padding-left: 17.5px;
}
.uni-button-loading {
width: 18px;
height: 18px;
margin-right: 10px;
}
.uni-button-d-loading {
color: rgba(255,255,255,0.6);
background-color: rgba(0,0,0,0);
}
.uni-button-p-loading {
color: rgba(255,255,255,0.6);
background-color: rgba(0,0,0,0);
}
.uni-button-w-loading {
color: rgba(255,255,255,0.6);
background-color: #ce3c39;
}
.uni-button-d-loading-plain {
color: #353535;
}
.uni-button-p-loading-plain {
color: #007aff;
background-color: #0062cc;
}
.uni-button-w-loading-plain {
color: #e64340;
background-color: rgba(0,0,0,0);
}
.uni-button-d-hover {
opacity: 0.8;
background-color: #dedede;
}
.uni-button-p-hover {
opacity: 0.8;
background-color: #0062cc;
}
.uni-button-w-hover {
opacity: 0.8;
backgroundColor: #ce3c39;
}
.uni-button-d-t-hover {
color: rgba(0,0,0,0.6);
}
.uni-button-p-t-hover {
color: rgba(255,255,255,0.6);
}
.uni-button-w-t-hover {
color: rgba(255,255,255,0.6);
}
.uni-button-d-hover-plain {
color: rgba(53,53,53,0.6);
border-color: rgba(53,53,53,0.6);
background-color: rgba(0,0,0,0);
}
.uni-button-p-hover-plain {
color: rgba(26,173,25,0.6);
border-color: rgba(0,122,255,0.6);
background-color: rgba(0,0,0,0);
}
.uni-button-w-hover-plain {
color: rgba(230,67,64,0.6);
border-color: rgba(230,67,64,0.6);
background-color: rgba(0,0,0,0);
}
</style>
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册